状态模式
很多情况下,一个对象的行为取决于一个或多个状态变化的属性,这样的属性叫状态。这样的对象叫做有状态的对象,这样的状态是从事先定义好的一系列值中获取的。当一个这样的对象与外部产生互动时,其内部状态就会改变,从而使得系统的行为也随之发生改变。
示例
环境类
1 |
|
抽象状态接口
1 |
|
具体状态类
1 |
|
测试类
1 | public void test() { |
结果
1 |
|
总结
状态模式和命令模式一样,可以用于消除if-else等条件选择语句。
- 优点
封装了状态转换规则,状态转换代码可以封装在环境类或者具体状态类中,可以对状态转换代码进行集中管理,而不是分散在一个个业务代码中。
将所有与状态有关的行为放到一个类中,只需要注入不同的状态对象即可是环境对象拥有不同的行为。
允许状态转换逻辑与状态对象合成一体,而不是提供一个巨大的条件语句块,状态模式可以让我们避免使用庞大的条件语句来讲业务方法和状态转换代码交织在一起。
- 缺点
增加系统内类的个数。
实现复杂,增加系统设计难度
对“开闭原则”支持不好,增加新的状态类需要修改负责状态转换的代码。