设计模式之状态模式

定义: 当对象的状态改变,其行为也会改变。

一般理解为,一个对象在不同的状态会有不同的方法调用。

比如在短信发送中,短信分为未发送,发送成功,发送失败等三个状态。

每一个状态的改变都需要有对应的动作处理。
在这里插入图片描述

/**
 * @author lw
 * @date 2022/3/29 0029
 * @description 短信服务
 */
public class SmsService {
    public void send(String content) {
        System.out.println("send "+content);
    }

    public void log(){
        System.out.println("记录日志");
    }

    public void notice(){
        System.out.println("告警信息: 发送失败");
    }
}

定义一个Service,单独看这个Service,发现它并没有任何逻辑,每个方法都是单独逻辑,完全找不到调用顺序。

但如果这是以短信状态为驱动的呢?

public class SmsSendSuccessState extends SmsState{ //成功
    @Override
    public void execute() {
        smsService.log();
    }
}

public class SmsSendFailState extends SmsState{  //失败
    @Override
    public void execute() {
        smsService.notice();
    }
}

public class SmsNotSendState extends SmsState {  //未发送

    @Override
    public void execute() {
        smsService.send("hello world");
    }
}

短信每个状态其实是能理解的,肯定先是未发送,然后有两个状态,成功和失败。

所以从状态理解,就能知道那些Service中方法调用顺序。

调用者

List<SmsInfo> infos = new ArrayList<>();
for (SmsInfo info : infos) {
    if(info.state.equals("N")){ //未发送,需要发送短信
        SmsState smsState = new SmsNotSendState();
        smsState.execute();
    }else if(info.state.equals("S")){ //发送成功,记录日志
        SmsState smsState = new SmsSendSuccessState();
        smsState.execute();
    }else if(info.state.equals("F")){ //发送失败,记录告警信息
        SmsState smsState = new SmsSendFailState();
        smsState.execute();
    }
}

如上图所示,不同的状态直接调用不同状态对应的类即可,无需关心里面做了什么操作。

当一个对象内部操作很复杂,只能理清他每一刻状态的变化时,那么从状态驱动变化就是一个不错的选择。

最典型的例子就是工作流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值