关于java:State状态模式

简介:

状态模式容许一个对象在其外部状态扭转的时候扭转其行为.这个对象看上去就像是扭转了它的类一样.

应用场景:

对这种有状态的对象编程,传统的解决方案是:将这些所有可能产生的状况全都思考到,而后应用 if-else 语句来做状态判断,再进行不同状况的解决。但当对象的状态很多时,程序会变得很简单。而且减少新的状态要增加新的 if-else 语句,这违反了“开闭准则”,不利于程序的扩大。

当一个对象的行为取决于它的状态,并且它必须在运行时依据状态扭转它的行为时,就能够思考应用状态模式

模式类图:


MM:美眉类
MMState:形象的状态类
ConcreteState1,ConcreteState2,ConcreteState3:具体的状态

模式实例:

如果有一个妹子,依据情绪好坏的不同状态,有不同的行为

1、MM 美眉类

public class MM {
    String name;
    MMState state;
    public MM(String name, MMState state) {
        this.name = name;
        this.state = state;
    }
    public void smile() {
        state.smile();
    }
    public void cry() {
        state.cry();
    }
    public void say() {
        state.say();
    }
}

2、MMState 形象的状态类

public abstract class MMState {
    abstract void smile();
    abstract void cry();
    abstract void say();
}

3、MMHappyState 开心状态类

public class MMHappyState extends MMState {
    @Override
 void smile() {
        System.out.println("开心的微笑");
    }
    @Override
 void cry() {
        System.out.println("笑到流眼泪");
    }
    @Override
 void say() {
        System.out.println("开心的谈话");
    }
}

4、MMNervousState 焦虑状态类

public class MMNervousState extends MMState {
    @Override
 void smile() {
        System.out.println("焦虑的微笑");
    }
    @Override
 void cry() {
        System.out.println("焦虑的哭");
    }
    @Override
 void say() {
        System.out.println("焦虑的谈话");
    }
}

5、MMSadState 伤心状态类

public class MMSadState extends MMState {
    @Override
 void smile() {
        System.out.println("伤心的微笑");
    }
    @Override
 void cry() {
        System.out.println("真哭");
    }
    @Override
 void say() {
        System.out.println("哭着说");
    }
}

6、Test 测试类

public class Test {
    public static void main(String[] args) {
        MM mm = new MM("alice", new MMHappyState());
        mm.smile();
        mm.cry();
        mm.say();
    }
}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理