// StrategyPattern.cpp : 定义控制台应用程序的入口点。
//通过此例程了解设计模式里的:“策略模式”
//策略模式:策略模式定义了一系列的算法,并将每一个算法封装起来,
//而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
//下面采用《大话设计模式》里的赵云拆锦囊的例子解释这一模式
//《三国演义》里赵云陪刘备去关东娶亲,临行时诸葛亮给了赵云三个锦囊
//为防不测,命令赵云在危机时刻一一打开这三个锦囊
//锦囊1:刚到吴国拆开 策略:找乔国老帮忙,让吴国太给孙权施加压力
//锦囊2:刘备乐不思蜀时拆开 策略:求吴国太开个绿灯,放行
//锦囊3:关东派兵追赶时拆开 策略:孙夫人断后,挡住追兵
//在这个情节里,赵云负责拆开锦囊,策略都放在锦囊里
#include "stdafx.h"
#include <process.h>
#include <iostream>
using namespace std;
//策略基类,提供接口
class CStrategy
{
public:
CStrategy()
{
}
virtual ~CStrategy()
{
}
public:
virtual void Opreate()=0;
};
//策略一:找乔国老帮忙,让吴国太给孙权施加压力
class CBackDoor:public CStrategy
{
public:
CBackDoor()
{
}
~CBackDoor()
{
}
public:
void Opreate()
{
cout<<"找乔国老帮忙,让吴国太给孙权施加压力"<<endl;
}
};
//策略二:求吴国太开个绿灯,放行
class COpenGreenLight:public CStrategy
{
public:
COpenGreenLight()
{
}
~COpenGreenLight()
{
}
public:
void Opreate()
{
cout<<"求吴国太开个绿灯,放行"<<endl;
}
};
//策略三:孙夫人断后,挡住追兵
class CBlockEnemy:public CStrategy
{
public:
CBlockEnemy()
{
}
~CBlockEnemy()
{
}
public:
void Opreate()
{
cout<<"孙夫人断后,挡住追兵"<<endl;
}
};
//锦囊类
class CContext
{
public:
CContext(CStrategy *pStrategy)
{
this->m_pStrategy=pStrategy;
}
~CContext()
{
delete this->m_pStrategy;
}
void Opreate()
{
this->m_pStrategy->Opreate();
}
private:
CStrategy *m_pStrategy;
};
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"---------策略模式测试案例-----------"<<endl<<endl;
cout<<"------------赵云到了关东,拆开第一个锦囊..----------------"<<endl;
CContext *pContext=new CContext(new CBackDoor());
pContext->Opreate();
delete pContext;
pContext=NULL;
cout<<endl;
cout<<"------------赵云发现主公不想回家了,决定拆开第二个锦囊..----------------"<<endl;
pContext=new CContext(new COpenGreenLight());
pContext->Opreate();
delete pContext;
pContext=NULL;
cout<<endl;
cout<<"--------------赵云发现孙权那孙子在后面追赶,立刻拆开第三个锦囊..--------------"<<endl;
pContext=new CContext(new CBlockEnemy());
pContext->Opreate();
delete pContext;
pContext=NULL;
system("pause");
return 0;
}