状态模式
- 状态模式
当一个对象的内在状态改变时允许改变其行为, 这个对象看起来像是改变了其类.
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况. 把状态的判断逻辑转移到表示不同状态的一系列类当中, 可以把复杂的判断逻辑简化
如果这个状态判断很简单,那就没必要用状态模式了
状态模式使用一个对象可以在不同的状态下表现出不同的行为。
- 状态的使用:
- 比如表示一个人在一天不同时刻的工作内容.
策略模式
- 策略模式
它定义了算法家族, 分别封装起来, 让它们之间可以相互替换, 此模式让算法的变化, 不会影响到使用算法的客户.
不同的策略都是完成相同的工作, 只是实现不同, 它可以以相同的方式调用所有的算法, 减少了各种算法类与使用算法类之间的耦合.
可以和工厂方法配合使用.
策略模式是对一组相关的算法进行封装,给调用方提供了运行时的灵活性
- 策略的使用
- 策略:商场的促销时不同的打折算法.可以看到这里的打折算法是可以相互替换的.
对比
- 状态模式可以帮助对象来管理它的状态
- 策略模式使得客户端可以选择不同的行为。
- 一个不太容易看到的区别是,谁去驱动行为的改变。
- 在策略模式中,是客户端驱动的,它给上下文信息提供了不同的策略
- 在状态模式中,状态的迁移是由Context或者State对象自己来管理的
- 从理论上说,策略模式和状态模式还有一个不同,前者定义的是一个对象“如何”去做一件事情,比如说如何对数据进行排序,而另一方面,状态模式定义的是“什么”以及“何时“,比如说一个对象能做什么,某个时间点它处于哪个状态。