二、21【设计模式】之状态模式

    技术2022-07-10  99

    今天的博客主题

           设计模式 ——》 设计模式之状态模式


    状态模式 SP (State Pattern)

     

    定义

    允许对象在内部状态发生改变时改变它的行为,看起来好像修改了它的类。

    类的行为是由状态决定的,不同的状态下该类有不同的行为。就是一个对象在其内部改变的时候,它的行为也随之改变。

    核心就是状态与行为的绑定,不同状态对应不同行为。

     

    应用场景

    在生活中的场景常见的就是订单状态的改变。

    1)行为随状态改变而改变的场景。

    2)一个操作中有大量分支存在,而这些分支状态又取决于对象的状态。

    3)

     

    优点

    1)结构清晰,将状态独立为类,消除分支判断,提高代码维护性。

    2)状态类职责明确具备扩展性。

    3)

     

    缺点

    1)如果一个事物具备多种状态,则状态类太多,类膨胀。

    2)状态模式的结构与实现都较为复杂,若使用不当则导致程序结构代码混乱。

    3)

     

    源码中的应用

    该模式的具体应用在源码中非常少见。

     

    代码示例

    状态模式主要包含以下几个角色

    上下文角色(Context):定义客户端需要的接口,维护一个当前状态实例,进行具体状态切换。

    抽象状态角色(state):定义该状态下的行为,可以有一个或多个。

    具体状态角色(ConcreteState):实现该状态对应的行为,在需要的情况下进行状态的切换。

    // 上下文角色 class Context{ private State state; public void setState(State state) { this.state = state; } } // 抽象状态角色 interface State{ // 抽象业务方法,不同的具体状态类可以不同的实现 void doSome(Context context); } // 具体状态角色 class StartState implements State { @Override public void doSome(Context context) { System.out.println("启动状态"); context.setState(this); } } class StopState implements State { @Override public void doSome(Context context) { System.out.println("停止状态"); context.setState(this); } } // 客户端调用 public class StatePattern { public static void main(String[] args) { Context context = new Context(); StartState start = new StartState(); start.doSome(context); StopState stop = new StopState(); stop.doSome(context); } }

    将一个对象在不同状态下的不同行为封装在一个个状态类中。

     

    状态机实现状态变动

    状态机试状态模式的一种应用,相当于是上下文角色的一个升级版。在工作流和游戏中有大量的使用。spring 也提供了一个很好的解决方案 StateMechine(状态机),帮助我们简化开发过程,让其结构更加层次化。

    需要引入jar,就不细说了,自行研究下

    <dependency> <groupId>org.springframework.statemachine</groupId> <artifactId>spring-statemachine-core</artifactId> <version>2.1.0.RELEASE</version> </dependency>

     

    Processed: 0.012, SQL: 9