狀態模式(State)定義:java
當一個對象的內在狀態改變時容許改變其行爲,這個對象看起來像是改變了其類。git
狀態模式主要解決的是當控制一個對象狀態的條件表達式過於複雜時的狀況。把狀態的判斷邏輯轉移到表示不一樣狀態的一系列類中,能夠把複雜的判斷邏輯簡化。github
類型:形爲型模式 ide
順口溜:中訪策備迭 觀模命狀職解this
package com.amosli.dp.behavior.state; public abstract class State { public abstract void handle(Context context); } package com.amosli.dp.behavior.state; public class Context { private State state; public State getState() { return state; } public void setState(State state) { this.state = state; } public Context(State state) { this.state = state; } public void request() { state.handle(this); } } package com.amosli.dp.behavior.state; public class ConcreteState1 extends State { @Override public void handle(Context context) { System.out.println("this is state1"); context.setState(new ConcreteState2()); } package com.amosli.dp.behavior.state; public class ConcreteState2 extends State { @Override public void handle(Context context) { System.out.println("this is state2"); context.setState(new ConcreteState3()); } } } package com.amosli.dp.behavior.state; public class ConcreteState3 extends State { @Override public void handle(Context context) { System.out.println("this is state3"); context.setState(new ConcreteState1()); } } package com.amosli.dp.behavior.state; public class Client { public static void main(String[] args) { Context context = new Context(new ConcreteState1()); context.request(); context.request(); context.request(); context.request(); } }
狀態模式包含以下角色:
Context: 環境類。能夠包括一些內部狀態。
State: 抽象狀態類。State定義了一個全部具體狀態的共同接口,任何狀態都實現這個相同的接口,這樣一來,狀態之間就能夠互相轉換了。
ConcreteState: 具體狀態類。具體狀態類,用於處理來自Context的請求,每個ConcreteState都提供了它對本身請求的實現,因此,當Context改變狀態時行爲也會跟着改變。spa
1 ) 它將與特定狀態相關的行爲局部化,而且將不一樣狀態的行爲分割開來code
2) 它使得狀態轉換顯式化orm
3) State對象可被共享1) 狀態模式的使用必然會增長系統類和對象的個數。
2) 狀態模式的結構與實現都較爲複雜,若是使用不當將致使程序結構和代碼的混亂。對象
6、源碼地址接口
本系列文章源碼地址,https://github.com/amosli/dp 歡迎Fork & Star !!