JAVA設計模式之狀態模式(state)


狀態模式:

  • 根據狀態決定動作
  • 當動作一定但是狀態可擴展適合使用狀態模式
  • 當動作變化不適合
  • 當狀態不會擴展也沒有必要使用使用傳統的switch即可。

先看一個沒有使用狀態模式的例子:

package com.srr.dp.state;

/**
 * 我的女朋友有很多種狀態
 * 當給我的女朋友添加新的狀態的時候下面所有方法的swith語句中都需要添加新的分支判斷
 * 簡而言之,這種實現方式當增加新的狀態時非常不方便
 */
public class GirFriend {

    private String name;
    private enum State {HAPPY,NORMAL}
    private State state;

    private void smile(){
        switch (state){
            case HAPPY:
                System.out.println("哈哈哈大笑");
                break;
            case NORMAL:
                System.out.println("微微一笑");
            default:
                System.out.println();
        }
    }

    private void cry(){
        switch (state){
            case HAPPY:
                System.out.println("笑中帶淚,感動的哭泣");
                break;
            case NORMAL:
                System.out.println("哇哇哭泣");
                break;
            default:
                System.out.println();
        }
    }

    private void say(){
        switch (state){
            case HAPPY:
                System.out.println("侃侃而談,風趣幽默");
                break;
            case NORMAL:
                System.out.println("沉默寡言,很少說話");
            default:
                System.out.println();
        }
    }

}

使用狀態模式之后代碼如下:

package com.srr.dp.state;

/**
 * 狀態抽象類
 */
abstract public class State {
    abstract void smile();
    abstract void cry();
    abstract void say();
}

package com.srr.dp.state;

/**
 * 女朋友的正常狀態
 */
public class NormalState extends State {
    @Override
    void smile() {
        System.out.println("微微一笑");
    }

    @Override
    void cry() {
        System.out.println("哇哇哭泣");
    }

    @Override
    void say() {
        System.out.println("沉默寡言,很少說話");
    }
}

package com.srr.dp.state;

/**
 * 女朋友高興狀態
 */
public class HappyState extends State {
    @Override
    void smile() {
        System.out.println("哈哈哈大笑");
    }

    @Override
    void cry() {
        System.out.println("笑中帶淚,感動的哭泣");
    }

    @Override
    void say() {
        System.out.println("侃侃而談,風趣幽默");
    }
}

package com.srr.dp.state;

/**
 * 當添加新的狀態的時候只需要添加新的狀態類繼承抽象state類
 */
public class GirFriend2 {

    private String name;
    private State state;

    public GirFriend2(String name,State state){
        this.name = name;
        this.state = state;
    }

    public void smile(){
        state.smile();
    }

    public void cry(){
        state.cry();
    }

    public void say(){
        state.say();
    }

}

package com.srr.dp.state;

/**
 * 測試類
 */
public class T {
    public static void main(String[] args) {
        State state = new HappyState();
        GirFriend2 girFriend = new GirFriend2("程瀟",state);
        girFriend.smile();
        girFriend.cry();
        girFriend.say();
    }

}

寫到這里當我女朋友添加一種新的狀態的時候只需要添加一個新的狀態類繼承抽象state類即可。

運行結果:

 


免責聲明!

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



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