首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

举动模式之策略模式(Strategy Pattern)(C++实现)

2012-06-29 
行为模式之策略模式(Strategy Pattern)(C++实现)策略模式(Strategy Pattern).定义了算法族,分别封装起来,

行为模式之策略模式(Strategy Pattern)(C++实现)

策略模式(Strategy Pattern).

定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。Strategy模式将逻辑(算法)封装到一个类里面,通过组合的方式将具体算法的实现在组合对象中实现,通过委托的方式将抽象接口的实现委托给组合对象实现。

1.设计原则:

a.找出应用中的可能变化之处,把它们独立出来,不要和那些不需要变化的代码混起来。(系统的某部分的改变不会影响其他部分)。

b.针对接口编程(利用多态针对超类型(通常为抽象类)进行编程),而不是针对实现编程。把会变化的行为抽取出来变成单独的接口,构成行为类。

c.多用组合,少用继承.(鸭子的行为不是继承过来的而是通过行为对象组合过来的)


2继承和组合的优缺点:

 继承:

   a.优点:易于修改和扩展那些被复用的实现

   b.缺点:1)破坏了封装性,继承中父类的实现细节暴露给子类了;
2)“白盒”复用,原因在1)中;
3)当父类的实现更改时,其所有子类将不得不随之改变
4)从父类继承而来的实现在运行期间不能改变(编译期间就已经确定了)。

组合

a.优点:

1)“黑盒”复用,因为被包含对象的内部细节对外是不可见的;2)封装性好,原因为1);

3)实现和抽象的依赖性很小(组合对象和被组合对象之间的依赖性小);

4)可以在运行期间动态定义实现(通过一个指向相同类型的指针,典型的是抽象

基类的指针)。

b.缺点:系统中对象过多。 从上面对比中我们可以看出,组合相比继承可以取得更好的效果,因此在面向对象的设计中的有一条很重要的原则就是:优先使用(对象)组合,而非(类)继承(Favor CompositionOver Inheritance)。


下面用C++实现《Head First设计模式》书中的鸭子模拟器的策略模式,类的关系图如下:

举动模式之策略模式(Strategy Pattern)(C++实现)


 头文件Duck.h