这里说一点自己对策略模式的粗略理解,希望后面回顾的时候,能一步步加深理解
什么情况下可以使用策略模式?
1、出现同一抽象有多个子类,需要用if-else或者switch-case来选择使用哪个子类的时候
2、对同一类型问题有不同的处理方式
需要三个部分:
1、策略接口(IStrategy):策略的基类
2、策略具体实现:各个策略的具体实现
3、策略环境(CContext):拥有一个策略引用
最后是通过这个策略环境来调用各个策略的
实现:
具体应用到当前场景,策略就是诸葛亮给赵云的三个妙计,策略环境即是锦囊,策略的执行者是赵云,赵云依次从锦囊中取出妙计,依计行事,最后成功让刘备娶得孙小妹
#ifndef STRATEGY_H
#define STRATEGY_H
#include <stdio.h>
#include <string>
#include <string.h>
using namespace std;
//策略接口
class IStrategy{
public:
IStrategy(){}
virtual ~IStrategy(){}
virtual void Operate() = 0;
};
//策略:找乔国老帮忙,使孙权不能杀刘备
class CBackDoor: public IStrategy{
public:
CBackDoor(): IStrategy() {}
~CBackDoor() {}
void Operate(){ printf("找乔国老帮忙,让吴国太给孙权施加压力\n"); }
};
//策略:让吴国太给开绿灯
class CGivenGreenLight: public IStrategy{
public:
void Operate() { printf("求吴国太开个绿灯,放行!\n"); }
};
//策略:孙夫人断后,挡住追兵
class CBlockEnemy: public IStrategy{
public:
void Operate() { printf("孙夫人断后,挡住追兵\n"); }
};
//计谋有了,那还需要锦囊呢
class CContext{
public:
CContext(IStrategy *_strategy){ strategy = _strategy; }
//该使用计谋了,看我出招
void Operate(){ strategy->Operate(); }
private:
IStrategy *strategy;
};
//赵云出场,他根据诸葛亮给他的交代,依次拆开妙计
class CZhaoYun{
public:
void run(){
CContext *context;
printf("------------刚刚到吴国的时候拆开第一个------------\n");
context = new CContext(new CBackDoor());
context->Operate();
printf("\n\n\n\n");
printf("------------刘备乐不思蜀了,拆开第二个------------\n");
context = new CContext(new CGivenGreenLight());
context->Operate();
printf("\n\n\n\n");
printf("------------孙权小兵追了,咋办,拆开第三个------------\n");
context = new CContext(new CBlockEnemy());
context->Operate();
printf("\n\n\n\n");
}
};
#endif // STRATEGY_H
源码参考《24种设计模式介绍与6大设计原则》一书