16. State Pattern 状态模式

在软件构建过程中,对象状态的改变,其行为也会发生改变。在不同的状态下,进行相同的操作,会有不同的响应,这种对于不同的状态进行不同的响应就会有很多if else来判断当前的状态。这和策略模式面临的问题很像。当有新的状态出现时,就要在后面再加else if。这就违背开闭原则。

与策略模式相同,将枚举类型提取为一个抽象基类。所有与状态相关的操作提取为抽象基类的方法。每个枚举值(状态)提取为一个子类,那么每个子类都要实现自己的操作方法,每个子类应该要使用单例模式。

此外,还有一个类,它组合了抽象基类,这个抽象基类在构造器中被赋值为具体的子类,并且也有所有的操作方法,在各个操作方法中,调用子类的相应方法。这样当状态增加时,就不需要更改其他类,只需要增加一个状态类。

除了可以在运行时根据不同的状态调用不同状态类的方法外,还可以在状态类中维护一个对象,这个对象是下一个状态类。这样使得状态的转换变得更加明确。

与策略模式不同的是,这里的操作可以对应多个操作方法,而策略模式只有一个操作方法。

状态模式结构图如下,其中的Handle方法可以有多个:

其实很多种设计模式中都有很多共同点,因为它们的思想是一样的。比如这里的状态模式与策略模式,都是通过将枚举类型转化为基类与子类,来避免写if-else,将编译时的多态转化为运行时的多态,而它们的差别仅仅是子类中对应的操作方法的个数,可以说它们就像一个设计模式,它们的名字却不那么重要。设计模式中不要纠结与代码的架构是否完全符合规范,重点应该是解决问题。

参考:https://www.bilibili.com/video/av24176315/?p=18

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值