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

今天的博客主题

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


状态模式 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>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值