【设计模式】策略模式
策略模式
关于策略模式,我的理解:有若干个策略(算法),有一个管理策略的类,该类的输入为策略,输入为不同的策略(算法),输出为该种策略(算法)对应的类对象(的动态类型),然后程序员手动去使用该类对象(的动态类型)去调用相应虚函数,根据多态机制实现执行不同的操作。
/************************************************************************ 设计模式2 策略模式 我们知道,一个公司里有若干个工种,每个工种做的工作是不同的,每种不同的工作 就可以看作是一个一个的策略(算法),以此为例来描述策略模式。 本文中有一个抽象基类【干活】类,三个子类【软件开发】、【市场拓展】 【数据处理】,每个子类代表一种操作,一种算法,几种策略 有一个用来管理各种策略的【TodoContext】上下文类,在此类中获取输入的策略的 实际动态类型,在此类对外提给客户的接口中调用了该抽象基类(指针),去调用 其虚函数完成操作。 ************************************************************************/
//【干活】抽象基类
class CDoSomething
{
public:
CDoSomething();
virtual void DoSomething() const = 0;
virtual ~CDoSomething();
};
CDoSomething::CDoSomething(){}
void CDoSomething::DoSomething() const
{
//do nothing
}
CDoSomething::~CDoSomething()
//【软件开发】类
class CSoftDevelop : public CDoSomething
{
public:
CSoftDevelop();
virtual void DoSomething() const;
virtual ~CSoftDevelop();
};
CSoftDevelop::CSoftDevelop() {}
void CSoftDevelop::DoSomething() const
{
cout << "\r\n研发部去写代码去,快去! 滚!\r\n";
}
CSoftDevelop::~CSoftDevelop(){}
//【市场拓展】类
class CBusinessDevelop : public CDoSomething
{
public:
CBusinessDevelop();
virtual void DoSomething() const;
virtual ~CBusinessDevelop();
};
CBusinessDevelop::CBusinessDevelop() {}
void CBusinessDevelop::DoSomething() const
{
cout << "\r\n市场部的兄弟们,最近业绩怎么样啊?什么?那还不快滚去出差!滚!\r\n";
}
CBusinessDevelop::~CBusinessDevelop(){}
//【数据处理】 类
class CDataHandle : public CDoSomething
{
public:
CDataHandle( );
virtual void DoSomething() const;
virtual ~CDataHandle();
};
CDataHandle::CDataHandle() {}
void CDataHandle::DoSomething() const
{
cout << "\r\n数据处理部的,模型做完了吗? 什么?还差点? 还不快加班做! 滚!\r\n";
}
CDataHandle::~CDataHandle(){}
用来管理各种策略(算法,干什么活)的上下文类
//【ToDo上下文】类
class CTodoContext
{
public:
//构造函数的参数为一个【干活】类指针,即一个策略(算法,干什么活)
CTodoContext(CDoSomething* ptr);
void DoSomething(); //此函数非虚,和【干活】类及其子类没有关系
virtual ~CTodoContext();
protected:
CDoSomething* m_ptrDoSomething;
};
CTodoContext::CTodoContext(CDoSomething* ptr)
{
m_ptrDoSomething = ptr;
}
void CTodoContext::DoSomething()
{
if (NULL != m_ptrDoSomething)
m_ptrDoSomething->DoSomething();
}
CTodoContext::~CTodoContext()
{
if(NULL != m_ptrDoSomething) delete m_ptrDoSomething;
}
main函数及执行结果如下
下一篇文章写写【策略模式】和【简单工厂模式】的结合
**********************技术交流请 email:cuihao0532#163.com 欢迎转载,转载请注明出处!***************************** 如果对本文满意请扫描文章左侧【二维码添加微信】获取更多好玩、有趣、有益、有营养的料,
你我共同成长!Y(^_^)Y
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗