一、描述
Strategy 模式和 Template 模式要解决的问题是相同(类似)的,都是为了给业务逻辑(算法)具体实现和抽象接口之间的解耦,但Strategy 模式将逻辑(算法)封装到一个类(Context)里面,通过组合的方式将具体算法的实现在组合对象中实现,再通过委托的方式将抽象接口的实现委托给组合对象实现。
Strategy 模式典型的结构图为:
这里的关键就是将算法的逻辑抽象接口(DoAction)封装到一个类中(Context),再通过委托的方式将具体的算法实现委托给具体的 Strategy 类来实现(ConcreteStrategeA类)。
二、实例:
刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,还别说,真是解决了大问题,搞到最后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子的。
先说这个场景中的要素:三个妙计,一个锦囊,一个赵云,妙计是小亮同志给的,妙计是放置在锦囊里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊中取出妙计,执行,然后获胜,用 C++程序怎么表现这个呢?我们先看类图:
本人的工程目录:
注释:
main(),赵云
CContext,锦囊
IStrategy,策略接口
CBackDoor,策略之一
CGivenGreenLight,策略之二
CBlockEnemy,策略之三
说明:一个策略放到一个锦囊里。当用的时候,找到这个锦囊,从锦囊里拿出策略来使用。
注意:锦囊只是简单的装载和调用策略,锦囊里没有逻辑。策略会有更大的自主权,运行更多的逻辑。
代码:
策略接口:IStrategy类
IStrategy.h
#ifndef __Strategy__IStrategy__ #define __Strategy__IStrategy__ #include <iostream> class IStrategy { public: IStrategy(void){} virtual ~IStrategy(void){} virtual void Operate(void) = 0; }; #endif /* defined(__Strategy__IStrategy__) */
策略之一:BackDoor类
BackDoor.h
#ifndef __Strategy__BackDoor__ #define __Strategy__BackDoor__ #include <iostream> #include "IStrategy.h" class CBackDoor:public IStrategy { public: CBackDoor(void); ~CBackDoor(void); void Operate(void); }; #endif /* defined(__Strategy__BackDoor__) */
BackDoor.cpp
#include "BackDoor.h" using std::cout; using std::endl; CBackDoor::CBackDoor(void) { } CBackDoor::~CBackDoor(void) { } void CBackDoor::Operate(void) { cout << "找乔国老帮忙,让吴国太给孙权施加压力" << endl; }
策略之二:GivenGreenLight类
GivenGreenLight.h
#ifndef __Strategy__GivenGreenLight__ #define __Strategy__GivenGreenLight__ #include <iostream> #include "IStrategy.h" class CGivenGreenLight:public IStrategy { public: CGivenGreenLight(void); ~CGivenGreenLight(void); void Operate(void); }; #endif /* defined(__Strategy__GivenGreenLight__) */
GivenGreenLight.cpp
#include "GivenGreenLight.h" using std::cout; using std::endl; CGivenGreenLight::CGivenGreenLight(void) { } CGivenGreenLight::~CGivenGreenLight(void) { } void CGivenGreenLight::Operate(void) { cout << "求吴国太开个绿灯,放行!" << endl; }
策略之三:BlockEnemy类
BlockEnemy.h
#ifndef __Strategy__BlockEnemy__ #define __Strategy__BlockEnemy__ #include <iostream> #include "IStrategy.h" class CBlockEnemy :public IStrategy { public: CBlockEnemy(void); ~CBlockEnemy(void); void Operate(void); }; #endif /* defined(__Strategy__BlockEnemy__) */
BlockEnemy.cpp
#include "BlockEnemy.h" using std::cout; using std::endl; CBlockEnemy::CBlockEnemy(void) { } CBlockEnemy::~CBlockEnemy(void) { } void CBlockEnemy::Operate() { cout << "孙夫人断后,挡住追兵" << endl; }
赵云: main入口主程序
main.cpp
#include <iostream> #include "Context.h" #include "IStrategy.h" #include "BackDoor.h" #include "GivenGreenLight.h" #include "BlockEnemy.h" using std::cout; using std::endl; int main(int argc, const char * argv[]) { CContext *pContext; cout << "----------刚刚到吴国的时候拆第一个----------" << endl; pContext = new CContext(new CBackDoor()); pContext->Operate(); delete pContext; cout <<"\n\n"; cout << "----------刘备乐不思蜀了,拆第二个了----------" << endl; pContext = new CContext(new CGivenGreenLight()); pContext->Operate(); delete pContext; cout <<"\n\n"; cout << "----------孙权的小兵追了,咋办?拆第三个----------" << endl; pContext = new CContext(new CBlockEnemy()); pContext->Operate(); delete pContext; // insert code here... std::cout << "Hello, World!\n"; return 0; }
结果如下:
参考文献:《设计模式之禅》,《GoF_23种设计模式解析》
参考博客: http://www.cnblogs.com/wanggary/archive/2011/04/07/2008796.html