设计模式——策略模式与状态模式

策略模式

Encapsulates interchangeable behaviors and use delegation to decide which one to use.

定义了算法族,分别封装起来,让它们之间可以互相替换。

此模式让算法的变化独立于使用算法的客户,由客户决定什么情况下使用具体策略角色。

使用场景:

1)许多相关类只是在行为上不同,可以动态地在许多行为中选择一种行为。

2)动态地在几种算法中选择一种。

3)避免暴露复杂的、特定用于算法的数据结构。

4)类定义了很多表现为多个条件语句的行为,应将分支移到各自策略类中。

设计模式——策略模式与状态模式

 

状态模式

Encapsulates state-based behaviors and use delegation to switch between behaviors.

允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

使用场景:

1)行为随状态改变而改变。

2)条件、分支语句的替代者。

设计模式——策略模式与状态模式

 

相同点:

类图基本是一样的。具体实现也比较类似。

不同点:

1)状态模式要对客户透明。策略模式不能对客户透明。(透明的意思是不可见)

2)状态模式的行为封装在状态对象中,当前状态在状态对象中游走改变,以反映出context内部的状态,客户不关心具体状态以及状态转换过程。策略模式常常是客户根据环境或条件的不同主动指定context所要组合的策略对象是哪一个,可在运行时改变策略方案,具有弹性。

3)状态模式可作为条件判断语句的替代。策略模式可作为继承之外的弹性替代方案。

4)状态模式是某个类的对象由多种状态且不同状态下行为有差异。策略模式是某类的某行为有多种实现方式。