首页 > 代码库 > 设计模式之: 策略模式
设计模式之: 策略模式
在GOF的《设计模式:可复用面向对象软件的基础》一书中对策略模式是这样说的:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。该模式使得算法可独立于使用它的客户而变化。
组成:
(1)Strategy—抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
{
定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。
}
{
定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。
}
(2)ConcreteStrategy1,ConcreteStrategy2,ConcreteStrategy3—具体策略角色:包装了相关的算法和行为。
{
实现了Strategy定义的接口,提供具体的算法实现。
}
{
实现了Strategy定义的接口,提供具体的算法实现。
}
(3)context—环境角色:持有一个策略类的引用,最终给用户调用。
UML图:
代码如下:
在这里我进行了将简单工程模式和策略模式的结合,这样能够使对象的new操作减少并且简单;
{
1、需要使用ConcreteStrategy提供的算法。
1、需要使用ConcreteStrategy提供的算法。
2、 内部维护一个Strategy的实例。
3、 负责动态设置运行时Strategy具体的实现算法。
4、负责跟Strategy之间的交互和数据传递。
}
}
应用场景:
1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。
UML图:
代码如下:
在这里我进行了将简单工程模式和策略模式的结合,这样能够使对象的new操作减少并且简单;
#include<iostream> using namespace std; enum strategy { Strategy1; Strategy2; Strategy3; }; //Context:使用一个ConcreteStrategy对象来配置;维护一个对Stategy对象的引用,同时,可以定义一个接口来让Stategy访问它的数据。 class context { public: context(strategy type) { switch type { case Strategy1: pStrategy=new ConcreteStrategy1(); break; case Strategy2: pStrategy=new ConcreteStrategy2(); break; case Strategy3: pStrategy=new ConcreteStrategy3(); break; default: break; } }; ~ context(){delete pStrategy;}; virtual void ContextInterface(){ if (pStrategy) pStrategy->alogrithmInterface(); }; private: Strategy* pStrategy; /* data */ }; //策略基类 class Strategy { public: Strategy(); ~Strategy(); virtual void alogrithmInterface()=0; /* data */ }; //具体策略1 class ConcreteStrategy1:Strategy { public: ConcreteStrategy1(); ~ConcreteStrategy1(); void alogrithmInterface() { cout<<"Im ConcreteStrategy1!" } /* data */ }; //具体策略2 class ConcreteStrategy2:Strategy { public: ConcreteStrategy2(); ~ConcreteStrategy2(); void alogrithmInterface() { cout<<"Im ConcreteStrategy2!" } /* data */ }; //具体策略3 class ConcreteStrategy3:Strategy { public: ConcreteStrategy3(); ~ConcreteStrategy3(); void alogrithmInterface() { cout<<"Im ConcreteStrategy3!" } /* data */ }; int main(int argc, char const *argv[]) { context* cont=new context(Strategy1); cont->ContextInterface(); delete cont; cont=NULL; cont=new context(Strategy2); cont->ContextInterface(); delete cont; cont=NULL; cont=new context(Strategy3); cont->ContextInterface(); delete cont; cont=NULL; return 0; }
设计模式之: 策略模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。