设计模式23——状态模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。

状态模式(State)

对象行为型模式。

目录

一、概述

1.1、直观的理解:

1.2、主要角色:

1.3、描述对象之间关系的UML图:

1.4、适用场景:

二、代码举例

2.1、对象之间的关系用UML图描述如下:

2.2、Java代码如下:


一、概述

复制代码
1、当一个对象的内在状态改变时改变它的行为,这个对象看起来像是改变了其类。

1.1、直观的理解

假设一个对象有三种状态,A、B、C。对象的状态从A到B到C顺序轮流变换,由此它的行为也会发跟着发生变化,就像是换了一个对象一样。

当然也不一定非要是A-》B-》C,也可以在状态上加条件语句,使其可以有选择性的改变。就不再举例了。

但此模式具体运行的细节要比上述复杂一些:

1.2、主要角色:

  • ++环境类++:被表示状态的对象,也就是可以改变状态的类
  • 状态类:++状态的抽象类或接口++ + ++状态的实现类++,表示环境类的某个状态

1.3、描述对象之间关系的UML图:

也就是说每次调用 环境类 里的 更改状态() 方法就会改变状态:

  • 调用 环境类 里的 更改状态() 方法
  • 更改状态()方法会将自己通过 operation()方法 传递给当前的状态类对象
  • 状态类对象收到请求后根据一定的规则,然后将下一个状态再传回给 环境类

1.4、适用场景:

复制代码
当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。
复制代码
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。

二、代码举例

就拿上述例子,状态由A到B再到C,循环变化。这个例子比较简单,就不再详细分析了。但你可以把本例当做一个模板,然后灵活使用:

2.1、对象之间的关系用UML图描述如下:

2.2、Java代码如下:

状态的抽象类:

java 复制代码
abstract class State {
    public abstract void handle(Context context);
}

状态A:

java 复制代码
public class ConcreteStateA extends State {
    @Override
    public void handle(Context context) {
        System.out.println("状态A");
        context.setState(new ConcreteStateB());//这里也可以条件语句判断下一个状态是谁
    }
}

状态B:

java 复制代码
public class ConcreteStateB extends State {
    @Override
    public void handle(Context context) {
        System.out.println("状态B");
        context.setState(new ConcreteStateC());//这里也可以条件语句判断下一个状态是谁
    }
}

状态C:

java 复制代码
public class ConcreteStateC extends State {
    @Override
    public void handle(Context context) {
        System.out.println("状态C");
        context.setState(new ConcreteStateA());//这里也可以条件语句判断下一个状态是谁
    }
}

环境类:

java 复制代码
public class Context {
    private State state;

    public Context() {
        this.state = new ConcreteStateA();
        System.out.println("初始化以A开始!");
    }

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }

    public void request() {
        this.state.handle(this);
    }
}

主程序(发起请求的类):

java 复制代码
public class Main {
    public static void main(String[] args) throws InterruptedException {
        Context context = new Context();
        while (true) {
            context.request();
            Thread.sleep(1000);
        }
    }
}

这里就不再举例了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。

如果觉得本文还不错,就请点个赞给作者一点鼓励吧!如果有建议,也请评论指教和讨论!

相关推荐
晚秋贰拾伍1 小时前
设计模式的艺术-命令模式
运维·设计模式·运维开发·命令模式·开闭原则
ZoeLandia1 小时前
从前端视角看设计模式之行为型模式篇
前端·设计模式
晚秋贰拾伍2 小时前
设计模式的艺术-迭代器模式
设计模式·迭代器模式
小肚肚肚肚肚哦5 小时前
函数式编程中各种封装的对比以及封装思路解析
前端·设计模式·架构
等一场春雨17 小时前
Java设计模式 九 桥接模式 (Bridge Pattern)
java·设计模式·桥接模式
等一场春雨20 小时前
Java设计模式 十四 行为型模式 (Behavioral Patterns)
java·开发语言·设计模式
小王子10241 天前
设计模式Python版 单例模式
python·单例模式·设计模式
_DCG_1 天前
c++常见设计模式之装饰器模式
c++·设计模式·装饰器模式
快乐非自愿1 天前
「全网最细 + 实战源码案例」设计模式——单例设计模式
java·单例模式·设计模式
阿绵1 天前
设计模式-模板方法实现
java·开发语言·设计模式