设计模式(c++)笔记之十四(Strategy模式)

来源:互联网 发布:衡阳软件培训 编辑:程序博客网 时间:2024/05/17 03:39

一、描述


      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

原创粉丝点击