[周五派] 行为模式-策略模式&状态设计模式
策略模式
策略模式建议找出负责用许多不同方式完成特定任务的类, 然后将其中的算法抽取到一组被称为策略的独立类中。
Java 程序库中策略模式的示例:
-
对
java.util.Comparator#compare()
的调用来自Collections#sort()
. -
javax.servlet.http.HttpServlet
: service()
方法, 还有所有接受HttpServletRequest
和HttpServletResponse
对象作为参数的doXXX()
方法。
识别方式: 策略模式可以通过允许嵌套对象完成实际工作的方法以及允许将该对象替换为不同对象的设置器来识别。
与其他模式的关系
-
模板方法模式基于继承机制: 它允许你通过扩展子类中的部分内容来改变部分算法。 策略基于组合机制: 你可以通过对相应行为提供不同的策略来改变对象的部分行为。 模板方法在类层次上运作, 因此它是静态的。 策略在对象层次上运作, 因此允许在运行时切换行为。
-
状态可被视为策略的扩展。 两者都基于组合机制: 它们都通过将部分工作委派给 “帮手” 对象来改变其在不同情景下的行为。 策略使得这些对象相互之间完全独立, 它们不知道其他对象的存在。 但状态模式没有限制具体状态之间的依赖, 且允许它们自行改变在不同情景下的状态。
状态设计模式
状态模式建议为对象的所有可能状态新建一个类, 然后将所有状态的对应行为抽取到这些类中。
状态模式可能看上去与策略模式相似, 但有一个关键性的不同 —— 在状态模式中, 特定状态知道其他所有状态的存在, 且能触发从一个状态到另一个状态的转换; 策略则几乎完全不知道其他策略的存在。
Java 程序库中一些状态模式的示例
-
javax.faces.lifecycle.LifeCycle#execute()
(由FacesServlet
控制: 行为依赖于当前 JSF 生命周期的阶段 (状态))
识别方式: 状态模式可通过受外部控制且能根据对象状态改变行为的方法来识别。
与其他模式的关系
状态可被视为策略的扩展。 两者都基于组合机制: 它们都通过将部分工作委派给 “帮手” 对象来改变其在不同情景下的行为。 策略使得这些对象相互之间完全独立, 它们不知道其他对象的存在。 但状态模式没有限制具体状态之间的依赖, 且允许它们自行改变在不同情景下的状态。
参考:
- Refactoring.Guru
- 《Android源码设计模式解析与实战》