本文共 2221 字,大约阅读时间需要 7 分钟。
策略模式:它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的用户
策略模式是一种定义一系列算法的方法,从概念上看,这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少各种算法类与使用算法类之间的耦合。
策略模式的Strategy 层为context 定义了一系列可重用的算法或行为,继承有助于析取出这些算法中的公共功能。 策略模式简化了单元测试,因为每一个算法都有自己的类,可以通过自己的接口单独测试 当不同的行为堆砌在一个类中的时候,就很难避免使用条件语句来选择合适的行为,将这些行为封装在一个个独立的Strategy 类中,可以在使用这些行为的类中消除条件语句。 策略模式是用来封装算法的,但在实际中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同的事件应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。 策略模式的主要优点如下。其主要缺点如下。
策略模式的主要角色如下。
代码实现
#includeusing namespace std;class Strategy{ public: virtual double calculate(double &src) = 0;};//正常收费class Normal:public Strategy{ public: double calculate(double &src) { return src; }};//折扣class Discount:public Strategy{ public: //必须输入一个折扣 Discount(double r):rebate(r){ } double calculate(double &src) { return src * rebate; }private: double rebate;};//返现class Cashback:public Strategy{ public: Cashback(double &s,double &b):standsrd(s),back(b){ } double calculate(double &src) { return src > standsrd ? (src-back):src; }private: double standsrd; double back;};class Context{ public: //传入一个原价和具体的策略 void setSrc(double &s) { src = s; } void setStrategy(Strategy *st) { strategy = st; } double contextCalculate() { //调用具体的策略的计算方法 return strategy->calculate(src); }private: //存放一个具体的策略 Strategy *strategy; double src;};int main(){ Strategy *sd = new Discount(0.8); double src = 100; Context c; c.setSrc(src); c.setStrategy(sd); cout << c.contextCalculate() << endl; double standard = 500; double back = 200; src = 700; Strategy * sc= new Cashback(standard,back); c.setSrc(src); c.setStrategy(sc); cout << c.contextCalculate() << endl; return 0;}
参考文献:《大话设计模式》
转载地址:http://wanwi.baihongyu.com/