JAVA設計模式-狀態模式-State-訂單狀態


21. State(狀態)
 
 
意圖:
允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改了它的類。
解釋:
比如說對訂單的提交,第一次提交是成功的,但是第二次提交的時候就會是失敗的,因為其內部狀態已經改變,而外部都是“訂單”調用了“提交”方法,同一個行為,但是實質上造成的效果已經不同。
 
適用性:
一個對象的行為取決於它的狀態, 並且它必須在運行時刻根據狀態改變它的行為。
一個操作中含有龐大的多分支的條件語句,且這些分支依賴於該對象的狀態。這個狀態通常用一個或多個枚舉常量表示。通常, 有多個操作包含這一相同的條件結構。State模式將每一個條件分支放入一個獨立的類中。這使得你可以根據對象自身的情況將對象的狀態作為一個對象,這一對象可以不依賴於其他對象而獨立變化。

解釋:

行為取決於它的狀態,即是說由狀態決定行為,方法放在狀態類中,而狀態控制亦在狀態類中進行,譬如一個按鈕,按一次是開,按一次是關,同一個行為,但是由於其狀態的改變,而導致不同的結果。
一個操作中含有龐大的多分支的條件語句,且這些分支依賴於該對象的狀態。這個狀態通常用一個或多個枚舉常量表示。通常, 有多個操作包含這一相同的條件結構。State模式將每一個條件分支放入一個獨立的類中。這使得你可以根據對象自身的情況將對象的狀態作為一個對象,這一對象可以不依賴於其他對象而獨立變化。
即是說以前你需要在某個行為的方法里面用if/else或者switch中寫的一堆業務,現在可以轉移到狀態類中了,而該狀態類是獨立的,非常便於流程管理。譬如之前的開關,你需要在toggle()中寫if/else,並且需要返回flag以便判斷狀態,而使用狀態類,將狀態分為開/關兩種狀態,只需要在狀態類的toggle()方法中寫入邏輯,將行為后的狀態返回即可。
 
實現:
需要實現這個邏輯:
那么我們就需要
3個具體狀態類(已預訂,已確認,已鎖定)
以及3個行為(確認,修改,支付)
 
抽象狀態類
abstract class OrderState {  
    abstract void confirm(OrderContext orderContext);  
  
    abstract void modify(OrderContext orderContext);  
  
    abstract void pay(OrderContext orderContext);  
}  
具體狀態類
class OrderedState extends OrderState {  
    @Override  
    void confirm(OrderContext orderContext) {  
        System.out.println("訂單已確認");  
        orderContext.setState(new ConfirmedState());  
    }  
  
    @Override  
    void modify(OrderContext orderContext) {  
        System.out.println("訂單已修改");  
        orderContext.setState(this);  
    }  
  
    @Override  
    void pay(OrderContext orderContext) {  
        System.out.println("預定狀態無法完成訂單!");  
    }  
}  
  
class ConfirmedState extends OrderState {  
    @Override  
    void confirm(OrderContext orderContext) {  
        System.out.println("訂單已確認,請勿重復確認");  
    }  
  
    @Override  
    void modify(OrderContext orderContext) {  
        System.out.println("訂單已修改,請再次確認");  
        orderContext.setState(new OrderedState());  
    }  
  
    @Override  
    void pay(OrderContext orderContext) {  
        System.out.println("訂單已支付,無法再修改");  
        orderContext.setState(new LockedState());  
    }  
}  
  
class LockedState extends OrderState {  
    @Override  
    void confirm(OrderContext orderContext) {  
        System.out.println("訂單已鎖定");  
    }  
  
    @Override  
    void modify(OrderContext orderContext) {  
        System.out.println("訂單已鎖定");  
    }  
  
    @Override  
    void pay(OrderContext orderContext) {  
        System.out.println("訂單已鎖定");  
    }  
}  
背景類
class OrderContext {  
    OrderState state = null;  
    //新建訂單設為已預定狀態  
    OrderContext() {  
        this.state = new OrderedState();  
    }  
  
    void setState(OrderState state) {  
        this.state = state;  
    }  
  
    public void confirm() {  
        state.confirm(this);  
    }  
  
    public void modify() {  
        state.modify(this);  
    }  
  
    public void pay() {  
        state.pay(this);  
    }  
}  
測試:
public static void main(String[] args) {  
    OrderContext orderContext = new OrderContext();  
    orderContext.confirm();     //已預定狀態>已確認狀態  
    orderContext.modify();      //已確認狀態>已預定狀態  
    orderContext.confirm();    //已預定狀態>已確認狀態  
    orderContext.pay();       //已確認狀態>已鎖定狀態  
    orderContext.modify();    //已鎖定狀態  
}  
訂單已確認  
訂單已修改,請再次確認  
訂單已確認  
訂單已支付,無法再修改  
訂單已鎖定  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM