策略模式
来源:互联网 发布:适合编程的笔记本电脑 编辑:程序博客网 时间:2024/06/03 11:08
- 一件事情要做成,往往有多种方法。比如一个专业3个班级,每个班级都是30人,要计算整个专业的人数,对于这个问题,我们既可以用加法也可以用乘法完成。
- 策略模式针对的就是这种情况:一个问题多种解法(策略)。
模式定义
策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式中,决策者类(如下例的CashContext)可以通过设置来选择使用不同的策略,从而得到不同的结果。
实例:
商场中商品的收费方式,是与商场的销售策略相关的。商场可以原价销售,也可以为了打开销路,选择打折的方式,或者返现的方式。而商场的收费系统是已打包好的软件,并不可能为了一个新的打折折扣率,就重新编译软件,为此,我们只有往往先设计好可能会用到的销售策略,但是策略具体执行多少的折扣率,则可以根据商场的需求随时更改。
基于这样一种多种销售策略的模式,根据当前的销售策略,适当的选择结算方法,策略模式正好能够满足。
/* 策略模式*/#ifndef _STRATEGY_#define _STRATEGY_#define NULL 0//抽象基类class Cash //收费结算(计算最终收费){public: virtual double acceptMoney(double x) = 0;};//收费方式:原价class CashNormal : public Cash{public: virtual double acceptMoney(double x) { return x; }};//收费方式:打折class CashRebate :public Cash {private: double Rebate = 1.0;//折扣public: CashRebate(double y) { this->Rebate = y; } virtual double acceptMoney(double x) { return x * Rebate; }};//收费方式:返利class CashReturn :public Cash {private: double bound = 0.0;//打折下界 double moneyReturn = 0.0;//返利public: CashReturn(double _b, double _R) { this->bound = _b; this->moneyReturn = _R; } virtual double acceptMoney(double x) { double res = x; if (x >= bound) res = x - (x / bound) * moneyReturn; return res; }};// 具体结算类class CashContext{public: // 设置收费方式 void setStrategy(Cash * _cs) { cs = _cs; } double GetResult(double money) { if (cs == nullptr) { return -1; } return cs->acceptMoney(money); }private: Cash * cs = nullptr;};#endif //_STRATEGY_
测试代码:
int main(){ Cash* func = new CashRebate(1.1); CashContext * money = new CashContext(); money->setStrategy(func); cout << money->GetResult(100) <<endl; //110 delete func; func = new CashReturn(80,10); money->setStrategy(func); cout << money->GetResult(100) <<endl; //87.5 return 0;}
小结
策略模式,适用于一个问题有多种解法的情况。所以,在工厂方法模式中给出的算术例子,其实也可以用策略模式来完成。
0 0
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- POJ 3415(后缀自动机)
- JAVA设计模式-代理模式
- 78.Evaluate the following query:
- iPhone入门学习——NetworkReachable学习笔记
- ssh (MVC软件开发模式)
- 策略模式
- Android:BaseListAdapter——摒弃ViewHolder使开发更高效的BaseAdapter
- CRITICAL_SECTION //critical_section
- View滑动动画的选择及其left, marginLeft, translationX参数的总结
- POJ 2479 Maximum sum(2次最大字段和)
- 如何让Window批处理文件可以支持带有空格的路径
- Defaulted 和 Deleted 函数--C++11
- Troubleshooting: 'Log file sync' Waits
- 围住神经猫