Java设计模式—状态模式
(尊重勞動成果,轉載請注明出處:https://blog.csdn.net/qq_25827845/article/details/52468077冷血之心的博客)
目錄
定義如下:
個人理解:
通用類圖:
角色介紹:
● State——抽象狀態角色
● ConcreteState——具體狀態角色
● Context——環境角色
通用源代碼:
場景類:
狀態模式的優點:
狀態模式的缺點:
使用場景:
狀態模式又是一個比較難的設計模式
定義如下:
當一個對象內在狀態改變時允許其改變行為,這個對象看起來像改變了其類。
個人理解:
通俗的講,狀態模式就是狀態的改變引起了行為的改變,但是,我們只能看到行為的改變,看不到狀態的改變。
通用類圖:
角色介紹:
● State——抽象狀態角色
接口或抽象類,負責對象狀態定義,并且封裝環境角色以實現狀態切換。
● ConcreteState——具體狀態角色
每一個具體狀態必須完成兩個職責:本狀態的行為管理以及趨向狀態處理,通俗地說,就是本狀態下要做的事情,以及本狀態如何過渡到其他狀態。
● Context——環境角色
定義客戶端需要的接口,并且負責具體狀態的切換。
舉個例子:
? ? ? ? 狀態模式提供了一種對物質運動的另一個觀察視角,通過狀態變更促使行為的變化,就類似水的狀態變更一樣,一碗水的初始狀態是液態,通過加熱轉變為氣態,狀態的改變同時也引起體積的擴大,然后就產生了一個新的行為:鳴笛或頂起壺蓋。
通用源代碼:
//抽象狀態角色 public abstract class State {//定義一個環境角色,提供子類訪問protected Context context;//設置環境角色public void setContext(Context _context){this.context = _context;}//行為1public abstract void handle1();//行為2public abstract void handle2(); }抽象狀態中聲明一個環境角色,提供各個狀態類自行訪問,并且提供所有狀態的抽象行為,由各個實現類實現。
//具體狀態角色 public class ConcreteState1 extends State { @Overridepublic void handle1() {//本狀態下必須處理的邏輯}@Overridepublic void handle2() {//設置當前狀態為stat2super.context.setCurrentState(Context.STATE2);//過渡到state2狀態,由Context實現super.context.handle2();} } public class ConcreteState2 extends State {@Overridepublic void handle1() { //設置當前狀態為state1super.context.setCurrentState(Context.STATE1);//過渡到state1狀態,由Context實現super.context.handle1();}@Overridepublic void handle2() {//本狀態下必須處理的邏輯} }具體狀態角色有兩個職責:處理本狀態必須完成的任務,決定是否可以過渡到其他狀態。
//環境角色 public class Context {//定義狀態public final static State STATE1 = new ConcreteState1();public final static State STATE2 = new ConcreteState2();//當前狀態private State CurrentState;//獲得當前狀態public State getCurrentState() {return CurrentState;}//設置當前狀態public void setCurrentState(State currentState) {this.CurrentState = currentState;//切換狀態this.CurrentState.setContext(this);}//行為委托public void handle1(){this.CurrentState.handle1();}public void handle2(){this.CurrentState.handle2();}}環境角色有兩個不成文的約束:
- 把狀態對象聲明為靜態常量,有幾個狀態對象就聲明幾個靜態常量。
- 環境角色具有狀態抽象角色定義的所有行為,具體執行使用委托方式。
場景類:
public class Client {public static void main(String[] args) {//定義環境角色Context context = new Context();//初始化狀態context.set CurrentState(new ConcreteState1());//行為執行context.handle1();context.handle2();} }如上所示:我們只看到了行為發生改變。
?
狀態模式的優點:
● 結構清晰
避免了過多的switch...case或者if...else語句的使用,避免了程序的復雜性,提高系統的可維護性。
● 遵循設計原則
很好地體現了開閉原則和單一職責原則,每個狀態都是一個子類,你要增加狀態就要增加子類,你要修改狀態,你只修改一個子類就可以了。
● 封裝性非常好
這也是狀態模式的基本要求,狀態變換放置到類的內部來實現,外部的調用不用知道類內部如何實現狀態和行為的變換。
狀態模式的缺點:
每一個狀態都是一個子類,容易產生子類膨脹的問題。
使用場景:
● 行為隨狀態改變而改變的場景
? ? ? ?這也是狀態模式的根本出發點,例如權限設計,人員的狀態不同即使執行相同的行為結果也會不同,在這種情況下需要考慮使用狀態模式。
● 條件、分支判斷語句的替代者
? ? ? ?在程序中大量使用switch語句或者if判斷語句會導致程序結構不清晰,邏輯混亂,使用狀態模式可以很好地避免這一問題,它通過擴展子類實現了條件的判斷處理。
?
如果對你有幫助,記得點贊哦~歡迎大家關注我的博客,我會持續更新,如果有什么問題,可以進群366533258一起交流學習哦~
?
總結
以上是生活随笔為你收集整理的Java设计模式—状态模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 企业邮箱WebMail协助办公功能盘点
- 下一篇: 带你入门Java网络爬虫