23种设计模式(14)--Strategy模式

来源:互联网 发布:通用航空软件 编辑:程序博客网 时间:2024/05/29 13:22

在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题?

定义一系列算法,把它们一个个封装起来,并且使它们可互相替换。该模式使得算法可独立于使用它的客户而变化。
                                                                                                                                        ——《设计模式》GoF

Strategy模式 结构:


代码实现:

#include "iostream"using namespace std;class Strategy{public:Strategy(){};virtual ~Strategy(){};virtual void AlgrithmInterface()=0;};class ConcreteStrategy1: public Strategy{public:ConcreteStrategy1(){};~ConcreteStrategy1(){};void AlgrithmInterface();};class ConcreteStrategy2: public Strategy{public:ConcreteStrategy2(){};~ConcreteStrategy2(){};void AlgrithmInterface();};void ConcreteStrategy1::AlgrithmInterface(){cout<<"ConcreteStrategy1"<<endl;}void ConcreteStrategy2::AlgrithmInterface(){cout<<"ConcreteStrategy2"<<endl;}/*Strategy通过组合的方式实现算法的异构,而Templete模式采用继承的方式*/class Client{public:Client(Strategy *pStrategy){ m_pStrategy = pStrategy;}~Client(){if(!m_pStrategy)delete m_pStrategy;}void DoAction();private:Strategy *m_pStrategy;};void Client::DoAction(){m_pStrategy->AlgrithmInterface();}int main(){Strategy *ps = new ConcreteStrategy1();Client *pc = new Client(ps);pc->DoAction();if(NULL != pc)delete pc;return 0;}

这里的关键就是将算法的逻辑抽象接口(DoAction)封装到一个类中(Context),再通过委托的方式将具体的算法实现委托给具体的Strategy类来实现(ConcreteStratege1类)。

在面向对象的设计中的有一条很重要的原则就是:优先使用(对象)组合,而非(类)继承(Favor Composition Over Inheritance)

0 0
原创粉丝点击