设计模式学习之C++实现的策略模式实例讲解
程序员文章站
2022-07-01 19:04:06
1.策略模式简介
英文名称
strategy 主要目的
定义一系列算法,把它们一个一个封装起来,并且使它们可以相互替换。策略使得算法可以独立于使用它的客户而变化。 使用场景
1.许多相关的类仅仅是行...
1.策略模式简介
英文名称
strategy 主要目的
定义一系列算法,把它们一个一个封装起来,并且使它们可以相互替换。策略使得算法可以独立于使用它的客户而变化。 使用场景
1.许多相关的类仅仅是行为有差别;
2.需要使用一个算法的不同变体时;
3.算法使用了客户不需要的数据。通过策略模式,可以避免暴露于算法有关的数据结构;
4.一个类定义了多种行为,并且这些行为在这个类的操作中是以多个判断语句的形式出现的。
2.策略模式代码示例
测试平台
1.开发语言:c++
2.开发工具:vs2015
3.操作:win7 x64 代码说明
1.strategy–抽象策略类,用来定义抽象接口;
2.concreatestrategynormal、concreatestrategysilver、concreatestrategygold–具体策略类,继承于抽象策略类,实现不同的计算策略;
3.context–上下文类,用一个具体策略来配置,实现不同策略的调用。
注意:
1.本例用策略模式来实现理发店消费金额结算;
2.通过策略模式,我们可以直接调整具体的策略,而不影响外部调用。
具体代码
#include using namespace std; //本例用策略模式来实现理发店消费金额结算 //结算规则如下: //普通会员:打9.5折 //银牌会员:打8折 //金牌会员:打6折 //抽象算法类,用来定义抽象接口 class strategy { public: //函数功能:抽象结账接口 //参数: const int imonetary[in]-- 消费金额 //返回值: 无 virtual void checkoutinterface(const int imonetary) = 0; }; //普通会员结账策略,具体策略类,继承于抽象策略类 class concreatestrategynormal :public strategy { public: //函数功能:普通会员结账策略 //参数: const int imonetary[in]-- 消费金额 //返回值: 无 void checkoutinterface(const int imonetary) { cout << "客户类型:" << "普通会员" << endl; cout << "结算金额:" << imonetary*0.95 << endl; } }; //银牌会员结账策略,具体策略类,继承于抽象策略类 class concreatestrategysilver :public strategy { public: //函数功能:银牌会员结账策略 //参数: const int imonetary[in]-- 消费金额 //返回值: 无 void checkoutinterface(const int imonetary) { cout << "客户类型:" << "银牌会员" << endl; cout << "结算金额:" << imonetary*0.8 << endl; } }; //金牌会员结账策略,具体策略类,继承于抽象策略类 class concreatestrategygold :public strategy { public: //函数功能:金牌会员结账策略 //参数: const int imonetary[in]-- 消费金额 //返回值: 无 void checkoutinterface(const int imonetary) { cout << "客户类型:" << "金牌会员" << endl; cout << "结算金额:" << imonetary*0.6 << endl; } }; //context类,上下文类,用一个具体策略来配置,实现不同策略的调用 class context { public: //函数功能:构造函数 //参数: strategy* pstrategy[in]-- 具体策略 //返回值: 无 context(strategy* pstrategy) { this->m_pstrategy = pstrategy; } //函数功能:析构函数,释放指针 //参数: 无 //返回值: 无 ~context() { if (this->m_pstrategy != null) { delete this->m_pstrategy; this->m_pstrategy = null; } } //函数功能:上下文接口,用于调用策略 //参数: 无 //返回值: 无 void contextinterface(const int imonetary) { if (this->m_pstrategy != null) { this->m_pstrategy->checkoutinterface(imonetary); } } private: strategy* m_pstrategy; //具体策略的指针 }; int main() { int imonetary = 200; //普通会员结算 cout << "顾客a消费金额:" << imonetary << endl; context* pcontextnormal = new context(new concreatestrategynormal()); if (pcontextnormal != null) { pcontextnormal->contextinterface(imonetary); delete pcontextnormal; pcontextnormal = null; } cout << "*******************************************" << endl; //银牌会员结算 cout << "顾客b消费金额:" << imonetary << endl; context* pcontextsilver = new context(new concreatestrategysilver()); if (pcontextsilver != null) { pcontextsilver->contextinterface(imonetary); delete pcontextsilver; pcontextsilver = null; } cout << "*******************************************" << endl; //金牌会员结算 cout << "顾客c消费金额:" << imonetary << endl; context* pcontextgold = new context(new concreatestrategygold()); if (pcontextgold != null) { pcontextgold->contextinterface(imonetary); delete pcontextgold; pcontextgold = null; } getchar(); return 0; }
输出结果