定义
策略模式定义了一组算法,算法可以相互替换。
策略三要素:上下文,策略父类,策略子类
策略模式和简单工厂模式的区别:简单工厂模式只负责生成对象,生成的对象再调用方法。而策略模式方法的调用封装在上下文中,不允许重复调用,减少了调用耦合。
特点
1. 算法切换
2. 上下文作用使封装子类的方法,防止上层直接调用子类方法,这也是和简单工厂类的主要区别。
缺点
具体的策略类多并且暴露在外
场景
1. 商场促销打折
2. 出行方式
示例代码
#include "stdafx.h"
#include <iostream>
//1. 策略父类
class strategy
{
public:
////算法实现接口
virtual void algorithmInterface()
{
printf("实现接口");
printf("\n");
};
};
//2. 策略子类
class ConcreteStrategyA:public strategy
{
public:
////算法实现接口
virtual void algorithmInterface()
{
std::cout<<("ConcreteStrategyA实现接口")<<std::endl;
};
};
class ConcreteStrategyB :public strategy
{
public:
////算法实现接口
virtual void algorithmInterface()
{
std::cout << ("ConcreteStrategyB实现接口") << std::endl;
};
};
//3. 上下文
class Context
{
public:
//设置当前使用的策略
void SetStrategy(strategy * strategy1)
{
_Strategy = strategy1;
}
//调用策略方法,将方法封装到上下文中
//,防止算法直接访问,这个和简单工厂模式最主要的区别
void ContextInterface()
{
_Strategy->algorithmInterface();
}
private:
strategy *_Strategy;
};
int main()
{
Context context;
ConcreteStrategyA strategy;
context.SetStrategy(&strategy);
context.ContextInterface();
ConcreteStrategyB strategyb;
context.SetStrategy(&strategyb);
context.ContextInterface();
getchar();
return 0;
}
结果:
ConcreteStrategyA实现接口
ConcreteStrategyB实现接口