策略模式
优点:
1.低耦合性
把各种复杂的策略,规则,或者业务给封装在策略管理器中,客户端只需要做出选择,而不用关心具体策略的初始化和创建是如何完成的
,调用策略也只是调用策略管理器,不会具体关心具体策略如何运作。
缺点:
和简单工厂模式一样,违背了开放-封闭原则,增加新策略需要去修改策略管理类
策略模式和简单工厂模式的区别:
简单工厂在于创建一个实例类,如何使用实例交由客户端决定。
策略模式是用于封装策略,客户端并不关心如何组合策略,只关心选择
#pragma once
#include <iostream>
#include <string>
using namespace std;
//策略模式
class IStrategy
{
public:
//策略所做的事情
virtual void Action() = 0;
};
class SA : public IStrategy
{
public:
SA(int s1, int s2):S1(s1),S2(s2)
{
}
virtual void Action() override
{
printf("策略A:优惠满%d 减%d\n",S1,S2);
}
int S1, S2;
};
class SB : public IStrategy
{
public:
SB(float s1) :S1(s1)
{
}
virtual void Action() override
{
printf("策略B:产品打折%f活动\n", S1);
}
float S1;
};
enum class StrategyType
{
A,
B
};
class StrategyContext
{
public:
StrategyContext(StrategyType type)
{
switch (type)
{
case StrategyType::A:
//具体的策略由策略管理器来创建,并初始化
CurrentStrategy = new SA(300,100);
break;
case StrategyType::B:
CurrentStrategy = new SB(0.9);
break;
default:
break;
}
}
void DoStrategy()
{
if (CurrentStrategy)
{
CurrentStrategy->Action();
}
}
protected:
IStrategy* CurrentStrategy;
};
void TestStrategy()
{
StrategyContext* Context = new StrategyContext(StrategyType::A);
Context->DoStrategy();
delete Context;
Context = new StrategyContext(StrategyType::B);
Context->DoStrategy();
delete Context;
}