來源:《設計模式之禪》java
定義:當一個對象在改變狀態時容許改變其行爲,這個對象看起來像改變了其類。狀態模式的核心時封裝,狀態的改變引發了行爲的改變,從外部看來好像是這個對象的對應的類發生了改變。設計模式
狀態模式三個角色:ide
State抽象狀態角色:負責對象狀態定義,封裝環境角色以實現狀態切換。this
ConcreteState 具體狀態角色:實現抽象狀態角色定義。具體狀態兩個主要職責,本狀態行爲管理和取向狀態處理。設計
Context 環境角色:定義客戶端須要的接口,負責具體狀態的切換。code
類圖:對象
代碼:接口
抽象狀態it
/** * */ package cc.pattern.state; /** * @author rico * 抽象狀態 */ public abstract class State { protected Context context; public void setContext(Context context) { this.context = context; } public abstract void handleOne(); public abstract void handlerTwo(); }
具體狀態class
/** * */ package cc.pattern.state; /** * @author rico * 具體狀態 */ public class StateOne extends State { /* (non-Javadoc) * @see cc.pattern.state.State#handleOne() */ @Override public void handleOne() { super.context.setCurrentState(Context.stateTwo); super.context.handleOne(); } /* (non-Javadoc) * @see cc.pattern.state.State#handlerTwo() */ @Override public void handlerTwo() { System.out.println("###StateOne.handlerTwo..."); } }
/** * */ package cc.pattern.state; /** * @author rico * 具體狀態 */ public class StateTwo extends State { /* (non-Javadoc) * @see cc.pattern.state.State#handleOne() */ @Override public void handleOne() { System.out.println("###StateTwo.handleOne..."); } /* (non-Javadoc) * @see cc.pattern.state.State#handlerTwo() */ @Override public void handlerTwo() { super.context.setCurrentState(Context.stateOne); super.context.handleTwo(); } }
上下文
/** * */ package cc.pattern.state; /** * @author rico * 上下文 */ public class Context { public static final StateOne stateOne = new StateOne(); public static final StateTwo stateTwo = new StateTwo(); // 當前狀態 private State currentState; public void setCurrentState(State state) { this.currentState = state; this.currentState.setContext(this); } public void handleOne() { this.currentState.handleOne(); } public void handleTwo() { this.currentState.handlerTwo(); } }
場景類
/** * */ package cc.pattern.state; /** * @author rico * 場景類 */ public class Client { /** * @param args */ public static void main(String[] args) { Context context = new Context(); //context.setCurrentState(new StateTwo()); context.setCurrentState(new StateOne()); context.handleOne(); context.handleTwo(); } }
狀態模式優勢:
結構清晰,避免過多的switch 或 if,下降程序的複雜性,提升系統的可維護性。
遵循了開閉原則和單一原則 。
封裝性很是好。外部的調用不須要知道類內部狀態和行爲的切換。
狀態模式肯定:
狀態太多,類回膨脹。
使用場景:
行爲隨狀態改變的場景。
條件/分支判斷語句的替代。
擴展: