狀態模式(State)—考勤系統
阿新 • • 發佈:2019-01-22
定義:
狀態模式是物件的行為模式,允許一個物件在其內部狀態改變時改變他的行為,這個物件看上去就像改變了他的類一樣。
角色:
環境(Context)角色:定義客戶端感興趣的介面,並且保留一個具體狀態類的例項,具體狀態類的例項給出環境類的當前狀態。
抽象狀態(State)角色:定義一個介面,用以封裝環境角色的具體狀態類的行為。
具體狀態(ConcreteState)角色:每一個具體狀態類都實現環境角色的狀態對應的具體行為。
例子:
每個工廠都會有考勤系統,其中對上班遲到的懲罰可分成不同的級別,如果遲到30分鐘之內不扣錢,如果遲到超過30分鐘要扣半天的工資,此時將遲到的行為抽象到介面中,作為抽象狀態角色(State),不同的遲到行為作為具體狀態角色(ConcreteState),環境角色則根據不同的狀態呼叫不同的具體狀態類。
類圖:
程式碼:
執行結果:/** * 環境角色類 * @author wang */ public class Context { //持有 一個CardState型別的物件 private CardState cardState = null; public void setCardState(CardState cardState){ this.cardState = cardState; } //轉交抽象類處理 public void request(String mess){ cardState.handle(mess); } } /** * 抽象狀態類 * @author wang */ public interface CardState { //相應的處理方法 public void handle(String mess); } /** * 具體狀態類 * @author wang */ public class ConcreteCardStateA implements CardState { public void handle(String mess) { System.out.println(mess + "遲到30分鐘之內,不扣錢" ); } } /** * 具體狀態類 * @author wang */ public class ConcreteCardStateB implements CardState { public void handle(String mess) { System.out.println(mess + "遲到超過30分鐘,扣半天工資"); } } /** * 客戶端類 * @author wang */ public class Client { public static void main(String[] args){ //建立狀態 CardState state = new ConcreteCardStateA(); //建立環境 Context context = new Context(); //將狀態設定到環境中 context.setCardState(state); //請求 context.request("我遲到了20分鐘,會有什麼懲罰:"); //建立狀態 CardState stateB = new ConcreteCardStateB(); //將狀態設定到環境中 context.setCardState(stateB); //請求 context.request("我遲到了40分鐘,會有什麼懲罰:"); } }