(二十一)、设计模式 之 状态模式(State)

(二十一)、设计模式 之 状态模式(State)

 

 

 

1、简介

定义: 状态模式是一种行为型设计模式。它允许对象在内部状态发生改变时改变它的行为,简单地讲就是,一个拥有状态的context对象,在不同状态下,其行为会发生改变。状态和行为是一一对应的(如果处于A状态,就拥有A状态所拥有的行为和操作),状态之间可以相互转换。

 

2、状态模式结构说明

  • 抽象状态(AbstractState):抽象状态(Abstract State):抽象状态类是所有具体状态类的基类或接口。负责定义该状态下的行为,可以一个或多个。
  • 具体状态(ConcreteState):是具体状态角色,根据自身的状态来实现State接口的方法。
  • 上下文(Context):用于维护State实例, 根据state的不同,实例对应的ConcreteState类也不同。

 

3、状态的选择与实现

  • ①可以在当前状态的实现中维护下一个状态的实现。参考责任链模式的设计。
  • ②可以在数据库中存储当前状态的下一个状态是什么,然后使用反射创建下一个状态的具体实现。

 

4、实现代码

复制代码
/**
 * @Author dw
 * @ClassName AbstractState
 * @Description 抽象状态
 * @Date 2023/12/19 17:20
 * @Version 1.0
 */
public abstract class AbstractState {

    /**
     * 可以在当前类中持有下一个状态
     */
    protected AbstractState nextState;

    public AbstractState (AbstractState nextState) {
        this.nextState = nextState;
    }

    /**
     * 当前状态对应的抽象行为
     */
    protected abstract void operation();
}



/**
 * @Author dw
 * @ClassName ConcreteState
 * @Description 具体状态
 * @Date 2023/12/19 17:20
 * @Version 1.0
 */
public class ConcreteState extends AbstractState {

    public ConcreteState(AbstractState nextState) {
        super(nextState);
        if (nextState == this) {
            throw new RuntimeException("存在循环引用!");
        }
    }

    /**
     * 当前状态对应的抽象行为
     */
    @Override
    protected void operation() {
        System.out.println("执行具体的状态处理逻辑");
    }
}



/**
 * @Author dw
 * @ClassName Context
 * @Description 上下文
 * @Date 2023/12/19 17:20
 * @Version 1.0
 */
public class Context {
    /**
     * 持有一个状态行为处理对象
     */
    private final AbstractState state;

    public Context (AbstractState state) {
        this.state = state;
    }

    /**
     * 执行当前状态的具体逻辑
     */
    public void someOperation () {
        // 执行当前状态处理操作
        state.operation();
        // 当前状态处理完成之后,继续执行后面状态的操作
        if (Objects.nonNull(state.nextState)) {
            state.nextState.operation();
        }
    }
}
复制代码

 

4、状态模式的应用场景

  • 当一个对象的行为取决于其内部状态,并且在不同状态下具有不同的行为时。
  • 当对象的行为在运行时需要根据其状态动态改变,并且需要避免大量的条件语句和分支判断时。
  • 当代码中存在大量的条件语句和分支逻辑,并且这些逻辑与对象的状态变化相关时。
  • 当对象的状态之间存在复杂的转换关系,并且需要维护状态转换的一致性时。

 

5、状态模式的优缺点
优点

  • 客户端只需要与上下文对象进行交互,而不需要了解具体状态对象的切换和行为实现细节。
  • 避免了使用大量的条件语句来控制对象在不同状态下的行为。它将状态相关的代码分散到各个具体状态类中,使代码更加清晰、可读性更高,易于维护和扩展。

缺点

  • 状态模式要求状态之间的变化有强的依赖关系, 必须掌握全部的状态,以及各个状态的流向。在中间环节新增状态,可能需要修改代码。
  • 状态的配置避免出现循环调用。


6、状态模式与策略模式的区别
可以发现状态模式和策略模式的代码结构一致。但这两种模式的应用场景是不一样的。策略模式的多种算法行为选择一种就能满足,彼此之间是独立的;而状态模式中各个状态间存在相互关系。

 

posted @   邓维-java  阅读(47)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示