设计模式-状态模式

Posted vinlen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-状态模式相关的知识,希望对你有一定的参考价值。

人愤怒的时候会想打人,高兴的时候想笑,人的状态执行了不同的方法,程序也是一样,程序也有状态。当一个方法里需要多个if else来判断逻辑的时候就要注意到,当对象的状态很多时,程序会变得很复杂,而且添加新状态就会增加新的if else语句,大大违反了开闭原则

我们可以使用状态模式,来为程序定义不同的状态时执行对应的动作。

状态模式分为三个角色,环境,抽象状态,具体状态。环境类也称为上下文,定义了一些客户端经常使用的接口,维护一个状态。并将与状态有关的操作委托给相应状态对象来执行

抽象状态

abstract class State {
    public abstract void Handle(Context context);
}

具体状态A

public class State1 extends State {
    @Override
    public void Handle(Context context) {
        System.out.println("执行状态A的动作");
        context.setState(new State2());

    }
}

具体状态B

public class State2 extends State {
    @Override
    public void Handle(Context context) {
        System.out.println("B处理");
        context.setState(new State1());
    }
}

环境

public class Context {
    State state;
    //初始状态
    public Context(State state){
this.state=state;
    }
    public void setState(State state){
        this.state=state;
    }

    public State getState() {
        return state;
    }
    public void excute(){
        state.Handle(this);
    }
}

测试类

public class Client {
    public static void main(String[] args) {
        Context context = new Context(new State1());
        context.excute();
        context.excute();
        context.excute();
        context.excute();
    }
}

总结:上述代码中,客户端是不知道状态的具体变化的。不同的状态执行了不同的动作。当然,可以在测试类里手动更改状态,也可以在具体状态类里更改状态。前者对客户端来说是已知的,后者则是未知的。

应用场景:一个方法中中含有庞大的分支结构,并且这些分支决定于对象的状态时。或者一个对象执行动作的过程取决于它的行为,且必须在运行时根据状态改变行为时都可以考虑使用状态模式。

以上是关于设计模式-状态模式的主要内容,如果未能解决你的问题,请参考以下文章

用于从 cloudkit 检索单列的代码模式/片段

是否有在单个活动中处理多个片段的 Android 设计模式?

方向/配置更改后如何维护 ListView 片段状态?

为不同方向使用不同布局时,在方向更改时保存片段状态

Sublime text3最全快捷键清单

csharp C#代码片段 - 使类成为Singleton模式。 (C#4.0+)https://heiswayi.github.io/2016/simple-singleton-pattern-us