策略模式
序言
还是参考的菜鸟教程,会C++的还是看C++的方式来得舒服。
.
理解
使用符合UML规范的便于理解和回忆,接口其实就是普通的基类
.
源码
strategy.h
cpp
/// 策略
class Strategy
{
public:
virtual ~Strategy();
/**
* @brief 计算
* @param num1 计算数值
* @param num2 被计算数值
* @return
*/
virtual int operation(const int& num1, const int& num2) = 0;
};
/// 加策略
class AddOperation : public Strategy
{
public:
/**
* @brief 加计算
* @param num1 计算数值
* @param num2 被计算数值
* @return
*/
int operation(const int &num1, const int &num2) override;
};
/// 减策略
class SubtractOperation : public Strategy
{
public:
/**
* @brief 减计算
* @param num1 计算数值
* @param num2 被计算数值
* @return
*/
int operation(const int &num1, const int &num2) override;
};
/// 上下文
class Context
{
public:
/**
* @brief 构造一个策略的上下文
* @param strategy 策略对象
*/
explicit Context(Strategy *strategy);
~Context();
/**
* @brief 计算
* @param num1 计算数值
* @param num2 被计算数值
* @return
*/
int operation(const int &num1, const int &num2);
private:
/// 所拥有的策略
Strategy *strategy = nullptr;
};
.
strategy.cpp
cpp
Strategy::~Strategy()
{
}
int AddOperation::operation(const int &num1, const int &num2)
{
return num1 + num2;
}
int SubtractOperation::operation(const int &num1, const int &num2)
{
return num1 - num2;
}
Context::Context(Strategy *strategy)
: strategy(strategy)
{
}
Context::~Context()
{
if (strategy)
delete strategy;
}
int Context::operation(const int &num1, const int &num2)
{
if (strategy)
{
return strategy->operation(num1, num2);
}
return INT_MIN;
}
.
使用的地方
cpp
std::shared_ptr< Context > context(new Context(new AddOperation));
std::cout << context->operation(10, 5) << std::endl;
context.reset(new Context(new SubtractOperation));
std::cout << context->operation(10, 5) << std::endl;
不同策略则生成不同的对象给Context,Context会根据其拥有的策略进行运算。