策略模式(c++实现)
策略模式
策略模式(Startegy):它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。
优点:
-
策略模式的strategy类层次为Context定义了一系列可供重用的算法或行为。继承有助于析取出这些算法中的公共功能。
-
简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。
广义作用:
策略模式就是用来封装算法的,但在实践中,我们发现可以用他来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。
与简单工厂模式结合:
在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。这个本身并没有解除客户端需要选择判断的压力,而策略模式与简单工厂模式结合后,选择具体实现的职责也可以由Context承担,这就是最大化的减轻了客户端的职责。任何需求的变更都是需要成本的。
UML类图如下:
代码如下:
strategy.h
class Strategy
{
public:
Strategy();
virtual ~Strategy();
virtual double getResult(double price) {return 0;};
};
context.h
#include <string>
#include "strategy.h"
class Context
{
public:
Context(std::string strName);
double getResult(double cash);
private:
Strategy* m_Strategy;
};
context.cpp
#include "context.h"
#include "Common.h"
Context::Context(std::string strName)
{
if ("dis" == strName) {
m_Strategy = new CashRebate(0.8);
}
else if("return" == strName)
{
m_Strategy = new CashReturn(200, 100);
}else if("nor" == strName)
{
m_Strategy = new CashNormal();
}
}
double Context::getResult(double cash)
{
if(m_Strategy)
return m_Strategy->getResult(cash);
}
common.h
#include "strategy.h"
#include "cashnormal.h"
#include "cashrebate.h"
#include "cashreturn.h"
cashnormal.h
#include "strategy.h"
class CashNormal : public Strategy
{
public:
CashNormal();
double getResult(double price) override;
};
cashnormal.cpp
#include "cashnormal.h"
#include <assert.h>
CashNormal::CashNormal()
{
}
double CashNormal::getResult(double price)
{
assert(price > 0);
return price;
}
cashrebate.h
#include "strategy.h"
class CashRebate : public Strategy
{
public:
CashRebate(double rebate);
double getResult(double price) override;
private:
double m_Rebate;
};
cashrebate.cpp
#include "cashrebate.h"
#include <assert.h>
CashRebate::CashRebate(double rebate)
: m_Rebate(rebate)
{
}
double CashRebate::getResult(double price)
{
assert(price > 0);
return price * m_Rebate;
}
cashreturn.h
#include "strategy.h"
class CashReturn : public Strategy
{
public:
CashReturn(double condition, double returnNum);
double getResult(double price) override;
private:
double m_Condition;
double m_RetunNum;
};
cashreturn.cpp
#include "cashreturn.h"
CashReturn::CashReturn(double condition, double returnNum)
:m_Condition(condition), m_RetunNum(returnNum)
{
}
double CashReturn::getResult(double price)
{
if(price >= m_Condition)
return price - m_RetunNum;
else
return price;
}
main.cpp
#include <iostream>
#include <iostream>
#include <memory>
#include "context.h"
using namespace std;
int main()
{
std::string input;
std::cout << "select promotions:" << std::endl;
std::cin >> input;
Context cn(input);
double res = cn.getResult(1000);
std::cout << "result is :" << res << std::endl;
return 0;
}
main函数里面通过输入来选择优惠的策略,context类通过输入使用简单工厂模式创建对应的类。总体感觉策略模式跟工厂模式差不多~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?