一、状态模式
能根据内部状态的变化,改变对象的行为,看起来好像修改了类
二、示例
智能糖果机:需要设计一款自助购买的糖果机,糖果机的状态有
- 准备使用(接下来可投入硬币)
- 投入硬币(接下来可摇动把手或者退出硬币)
- 售出糖果(接下来可恢复使用或者售罄)
- 售罄状态
使用传统的面向对象模式,只需定义一个糖果机的对象,内部根据不同的状态进行不同的操作处理
1 |
|
缺点:各种行为耦合度较高,不利于新需求的拓展
三、状态模式改进
虽然传统的面向对象模式也可满足功能,但是若新增需求则不利于拓展。加入此项目新增一个幸运者的功能,售出糖果的时候有一定几率成为幸运者掉出两颗糖果。
若满足该功能,则需在原本完成的糖果机代码中修改,则易造成其他不必要的bug,则引出状态模式:
- 定义一个状态接口,接口定义需要处理的方法
- 定义不同状态的接口对象,对象内实现不同状态对不同操作的处理
1.定义统一的状态接口
1 | /** |
2.将不同的状态对象实现接口以及接口的不同处理方法
1 |
|
3.糖果机内部只需定义不同的状态对象
1 |
|
4.对象调用
1 |
|
四、总结
在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的(stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的。当一个这样的对象与外部事件产生互动时,其内部状态就会改变,从而使得系统的行为也随之发生变化。
Java设计模式所有示例代码,持续更新中