设计模式之状态模式

状态模式是一种行为设计模式,当对象的行为依赖于它的状态时,可以使用此模式将与每种状态相关的行为封装在独立的类中。在Java中,通过创建具体状态类并让上下文持有这些状态,可以实现对象在不同状态间平滑切换,使得代码更加清晰和可维护。
摘要由CSDN通过智能技术生成

当一个对象的内在状态改变时允许改变其行为,这和对象看起来像是改变了其类(将与特定状态相关的行为局部化,并将不同状态的行为局部化,并将不同状态的行为分割来),当行为依赖于状态时那么状态模式很适用

具体状态类:

@AllArgsConstructor
abstract class AbstractState {

    protected String name;

    /**
     * 状态执行方法
     * @param context 持有状态的上下文
     */
    abstract void handle(Context context);
}

class ConcreteStateA extends AbstractState {

    ConcreteStateA(String name) {
        super(name);
    }

    @Override
    public void handle(Context context) {
        context.setState(new ConcreteStateB("ConcreteStateB"));
    }
}

class ConcreteStateB extends AbstractState {

    ConcreteStateB(String name) {
        super(name);
    }

    @Override
    public void handle(Context context) {
        context.setState(new ConcreteStateA("ConcreteStateA"));
    }
}

持有状态的上下文:

@Log4j2
@AllArgsConstructor
@Data
class Context {

    private AbstractState state;

    public void request() {
        log.info("当前状态:{}", state.name);
        state.handle(this);
    }
}

运用:

        Context context = new Context(new ConcreteStateA("ConcreteStateA"));
        context.request();
        context.request();
        context.request();
        context.request();
        context.request();

结果:

16:40:49.688 [main] INFO com.learn.putc.designpatterns.behavior.state.Context - 当前状态:ConcreteStateA
16:40:49.697 [main] INFO com.learn.putc.designpatterns.behavior.state.Context - 当前状态:ConcreteStateB
16:40:49.697 [main] INFO com.learn.putc.designpatterns.behavior.state.Context - 当前状态:ConcreteStateA
16:40:49.697 [main] INFO com.learn.putc.designpatterns.behavior.state.Context - 当前状态:ConcreteStateB
16:40:49.697 [main] INFO com.learn.putc.designpatterns.behavior.state.Context - 当前状态:ConcreteStateA

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值