设计模式(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
- 设计模式(c++)笔记之十四(Strategy模式)
- 设计模式之十四------Strategy(策略)
- 23种设计模式之十四(行为模式)Strategy模式
- 无废话C#设计模式之十四:Strategy
- 设计模式C++(Strategy策略模式)
- 设计模式C++(Strategy策略模式)
- 【设计模式】之策略模式(Strategy)
- 设计模式之--策略模式(Strategy)
- 设计模式之策略(strategy)模式
- 设计模式之策略模式(Strategy)
- 设计模式之策略模式(Strategy)
- 设计模式之:策略模式(strategy)
- 设计模式之策略(Strategy)模式
- 设计模式之策略模式(strategy)
- 设计模式之策略模式(STRATEGY)
- 设计模式笔记之Strategy Pattern
- 设计模式之 strategy
- 设计模式之Strategy
- 二分图最大匹匈牙利算法图解
- HDU2795:Billboard(线段树单点更新)
- UVA 567 Floyd算法
- ANTLR3 简介及示例
- UVALive - 6151
- 设计模式(c++)笔记之十四(Strategy模式)
- 数塔
- s3c2440 uda1341声卡驱动分析
- 强联通图判断 裸强联通判断 hdu Problem-1269 迷宫城堡
- 在ubuntu12.04上用qvfb运行QtE程序
- win7wifi共享
- 各种java中文乱码及解决方案
- 五只猴子分桃
- Software