设计模式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可以直接运行。

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

相关推荐
AM越.1 天前
Java设计模式超详解--观察者设计模式
java·开发语言·设计模式
ezreal_pan1 天前
基于券类型路由的渐进式重构:函数式选项模式与管道模式的完美结合
设计模式·重构·golang·选项函数
有一个好名字1 天前
设计模式-单例模式
java·单例模式·设计模式
简单点好不好1 天前
2025--简单点--python之状态模式
开发语言·python·状态模式
赵得C1 天前
2025下半年软件设计师考前几页纸
java·开发语言·分布式·设计模式·性能优化·软考·软件设计师
alibli1 天前
Alibli深度理解设计模式系列教程
c++·设计模式
老朱佩琪!1 天前
Unity迭代器模式
unity·设计模式·迭代器模式
是2的10次方啊1 天前
🎭 程序员的一天:12种设计模式藏在你身边
设计模式
郝学胜-神的一滴1 天前
使用Qt OpenGL开发俄罗斯方块:从零到一实现经典游戏
c++·qt·程序人生·游戏·设计模式·系统架构·图形渲染
明洞日记1 天前
【设计模式手册018】访问者模式 - 分离数据结构与操作
数据结构·设计模式·访问者模式