现在的位置: 首页 > 综合 > 正文

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

2013年12月11日 ⁄ 综合 ⁄ 共 3130字 ⁄ 字号 评论关闭

一、描述

      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

抱歉!评论已关闭.