意图:
定义一系列算法,把它们一个个封装起来,并且使它们相互可替换。使得算法独立于使用它的客户变化而变化。
适用性:
1许多相关的类仅仅是行为有异,策略提供了一种用多个行为中的一个行为来配置一个类的方法
2需要使用一个算法的不同变体
3算法使用客户不应该知道的数据
4一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的strategy类中以代替这些条件语句。
效果:
1相关算法系列 Strategy类层次为Context定义了一系列可供重用的算法或行为
2一个替代继承的方法
3消除了一些条件语句
4Strategy和Context之间的通信开销
5增加了对象数目
实现:
1定义Strategy和Context接口 一种办法是让Context将数据放在参数中传递给Strategy操作,这使得Context和Strategy解耦。另一种方法是让Context将自身作为一个参数传递给Strategy,Strategy和Context耦合在一起
2可将Strategy作为模版参数
3使Strategy对象成为可选
The code is as below:
Strategy.h
- #include <iostream>
- using namespace std;
- class Compositor;
- class Composition
- {
- public:
- Composition(Compositor*);
- void Repair();
- private:
- Compositor* _compositor;
- };
- class Compositor
- {
- public:
- virtual void Compose() =0;
- protected:
- Compositor() {cout<<"A compositor is created"<<endl;}
- };
- class SimpleCompositor :public Compositor
- {
- public:
- SimpleCompositor() {cout<<"A simple compositor is created"<<endl;}
- virtual void Compose();
- };
- class TextCompositor:public Compositor
- {
- public:
- TextCompositor() {cout<<"A Text compositor is created"<<endl;}
- virtual void Compose();
- };
Strategy.cpp
- #include "Strategy.h"
- #include <iostream>
- using namespace std;
- Composition::Composition(Compositor* a)
- {
- _compositor = a;
- }
- void Composition::Repair()
- {
- _compositor->Compose();
- }
- void SimpleCompositor::Compose()
- {
- cout<<"Compose the file in the simple compose way"<<endl;
- }
- void TextCompositor::Compose()
- {
- cout<<"Compose the file in the text compose way"<<endl;
- }
main.cpp
- #include "Strategy.h"
- #include <iostream>
- using namespace std;
- int main()
- {
- SimpleCompositor* b = new SimpleCompositor;
- TextCompositor* c = new TextCompositor;
- Composition a(b);
- Composition f(c);
- a.Repair();
- f.Repair();
- return 0;
- }