JAVA设计模式之状态模式(state)

2020-05-23 16:06:59来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

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类即可。

运行结果:

 


原文链接:https://www.cnblogs.com/sx-bj-srr/p/state.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:第六章第三十四题(打印日历)(Print calendar) - 编程练习题答

下一篇:HashMap 的 7 种遍历方式与性能分析!(强烈推荐)