比较策略(strategy)模式和状态(state)模式

什么是设计模式?

GOF这样定义模式:模式就是表示特定情境、问题、与方案之间的关系。

那设计模式是什么呢?

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
GoF(“四人帮”,指Gamma, Helm, Johnson & Vlissides, Addison-Wesley四人)的《设计模式》(1995年出版)是第一次将设计模式提升到理论高度,并将之规范化,本书提出了23种基本设计模式,自此,在可复用面向对象软件的发展过程中,新的大量的设计模式不断出现。

 

GOF23中基本设计模式中策略模式和状态模式应该是很常用的,但是这两种模式之间很神似,但又有不同。

策略(Strategy)模式

策略模式属于对象的行为模式【GOF95】。其用意是针对一组算法,将每一个算法封装在具有共同接口的独立的类中,从而使他们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

 

比较策略(strategy)模式和状态(state)模式

图1. 策略模式类图

策略模式涉及到三种角色:

环境角色(Context)角色:持有一个Strategy的应用;

抽象策略(Strategy)角色:通常由一个接口或抽象类来实现,给出所以具体策略类所需要的接口;

具体策略(ConcreteStrategy)角色:实现抽象策略,包装了相关的算法或行为。

 

策略模式的应用场景:

1。一个系统要在几个算法中动态选取其中一个。

2。一个对象有过多的行为,复杂的条件转移语句。

状态(state)模式

 状态模式也是对象的行为模式【GOF95】。状态模式将所研究对象的行为包装到不同的状态对象中,每个状态对象都属于抽象状态类的一个子类。其意图是让一个对象在其内部状态发生改变的是,其行为也随之改变。

  

比较策略(strategy)模式和状态(state)模式

图2. 状态模式类图

状态模式所涉及的角色也有三种:

环境(Context)角色:定义客户端感兴趣的接口,持有一个具体状态类的实例,这个具体状态类实例给出此环境对象的现有状态;

抽象状态(State)角色:定义接口,封装环境对象的一个特定状态所对应的行为;

具体状态(ConcreteState)角色:实现环境的一个状态所对应的行为。

 

状态模式的应用场景:

1。一个对象的行为依赖于他当前所处的状态,对象的行为必须随着状态的改变而改变;

2。对象在某个方法离依赖于一重或多重的条件转移语句,其中有大量代码。可以通过状态模式,将条件转移语句的每一个分支都包装到一个单独的类中,这使得所有的条件转移语句分支能够以类的方式独立存在和演化,这些类的改到不会影响到系统的其他部分。

 

比较

策略模式和状态模式从类图上看很像,非常容易混淆。

他们的相同之处:

1。环境都是持有一个抽象接口,而行为封装到具体的实现类中;

2。都符合开闭原则和里氏代换原则。

 

差异:

1。策略模式是一旦环境(context)选择了一个具体实现,在其生命周期就一般不会改变;而状态模式是环境有明显的状态迁移,这时行为就会随状态而变;

2。策略模式是环境类自己主动选择的具体策略类;而状态模式是被动的改变状态。

 

 

你可能感兴趣的:(设计模式,算法,出版)