赞
踩
简单工厂模式只是解决对象的创建问题,而且由于工厂本身包括了所有的收费方式,商场可能经常性的更改打折额度和返利额度,每次维护或者扩展收费方式都要改动这个工厂,以致代码需要重新编译部署,这不是一种好方法。而且为了创建不同的对象产品使用了switch case(或if else)的形式实现代码,这样违背了开闭原则,即对扩展开放、对修改封闭,维护的成本会随着cese(或else)的增加而增加,而本文的策略模式能较好地解决这个问题。
策略模式是处理算法不同变体的一种行为型模式。策略模式通过接口或抽象类提供公共的函数接口,即在抽象类中定义一个抽象方法,实现该接口的派生类将实现该抽象类中的抽象方法。策略模式把针对不同派生类一系列的具体算法分别封装在不同的派生类中,使得各个派生类给出的具体算法可以相互替换。
在策略模式中,抽象类提供公共的函数接口称作策略,实现该接口的派生类称作具体策略。
Strategy是使用接口还是抽象类,这个取决于一系列的策略中是否有共同属性或方法;如果没有,使用接口更加灵活方便,反之使用抽象类,抽象类中便可存放公共的属性以及方法。
它定义了算法家族,分别封装起来,让他们之间可以互相转换,此模式让算法的变化,不会影响到使用算法的客户
商场售卖商品的时候针对不同场景指定不同的折扣策略(原价消费/折扣消费/返利消费),通过构建不同的对象来实现不同策略切换.
- #include<iostream>
- #include<string>
- #include<vector>
- #include<stack>
- #include<cmath>
- using namespace std;
-
- /**
- * 现金收费抽象类
- */
- class CashSuper {
- /**
- * 现金收取超类的抽象方法,收取现金
- * @param money 原价
- * @return 当前价
- */
- public:
- virtual double acceptCash(double money)=0;
- };
-
- /**
- * 正常收费子类
- */
- class CashNormal: public CashSuper {
- public:
- double acceptCash(double money) {
- return money;//正常原价返回
- }
- };
-
- /**
- * 打折收费子类
- */
- class CashRebate: public CashSuper {
- private:
- double moneyRebate;
- /**
- * 打折收费,初始化时,必须输入折扣率,如八折,就是0.8
- *
- * @param moneyRebate
- */
- public:
- CashRebate(double moneyRebate) {
- this->moneyRebate = moneyRebate;
- }
-
- double acceptCash(double money) {
- return money * moneyRebate;
- }
- };
-
- /**
- * 返利收费子类
- */
- class CashReturn: public CashSuper {
- private:
- double moneyCondition;
- /**
- * 返利金额,即满足条件以后返还X元
- */
- double moneyReturn;
-
- /**
- * 返利收费,初始化时必须输入返利条件和返利金额,比如满300元减100元,则moneyCondition=300,moneyReturn=100
- *
- * @param moneyCondition 返利条件
- * @param moneyReturn 返利金额
- */
- public:
- CashReturn(double moneyCondition, double moneyReturn) {
- this->moneyCondition = moneyCondition;
- this->moneyReturn = moneyReturn;
- }
-
- double acceptCash(double money) {
- double result = money;
- //若消费金额大于返利条件就进行返利计算
- if (money > moneyCondition) {
- //结果=总消费金额-(总金额整除返利条件)*返还金额,例如消费910元,610=910-(910/300)*100
- result = money - (int) floor(money/moneyCondition) * moneyReturn;
- }
- return result;
- }
- };
-
- /**
- * 策略上下文类
- */
- class CashContext {
-
- /**
- * 策略
- */
- private:
- CashSuper *cs;
-
- /**
- * 初始化要使用的策略
- *
- * @param cSuper
- */
- public:
- CashContext(CashSuper *cSuper) {
- this->cs = cSuper;
- }
-
- /**
- * 获得计算结果
- *
- * @param money
- */
- double GetResult(double money) {
- return cs->acceptCash(money);
- }
- };
-
-
-
- int main(int argc, char * args[]){
- //返回结果
- double total;
- //采用正常收费策略
- CashSuper *cs;
- CashContext *cc;
-
- cs = new CashNormal();
- cc = new CashContext(cs);
- total = cc->GetResult(910);
- cout<<"采用正常收费策略:"<<total<<endl;
- //采用打折收费策略
- cs = new CashRebate(0.8);
- cc = new CashContext(cs);
- total = cc->GetResult(910);
- cout<<"采用打折收费策略:"<<total<<endl;
- //采用返利收费策略
- cs = new CashReturn(300, 100);
- cc = new CashContext(cs);
- total = cc->GetResult(910);
- cout<<"采用返利收费策略:"<<total<<endl;
-
- return 0;
- }
- /**
- * 策略上下文类
- */
- class CashContext {
-
- /**
- * 策略
- */
- private:
- CashSuper *cs;
-
- /**
- * 初始化要使用的策略
- *
- * @param cSuper
- */
- public:
- CashContext(int i) {
- switch(i)
- {
- case 1:
- cs = new CashNormal();
- break;
- case 2:
- cs = new CashRebate(0.8);
- break;
- case 3:
- cs = new CashReturn(300, 100);
- break;
- }
- }
-
- /**
- * 获得计算结果
- *
- * @param money
- */
- double GetResult(double money) {
- return cs->acceptCash(money);
- }
- };
-
-
-
- int main(int argc, char * args[]){
- //返回结果
- double total;
- //采用正常收费策略
- CashContext *cc;
-
- cc = new CashContext(1);
- total = cc->GetResult(910);
- cout<<"采用正常收费策略:"<<total<<endl;
- //采用打折收费策略
-
- cc = new CashContext(2);
- total = cc->GetResult(910);
- cout<<"采用打折收费策略:"<<total<<endl;
- //采用返利收费策略
-
- cc = new CashContext(3);
- total = cc->GetResult(910);
- cout<<"采用返利收费策略:"<<total<<endl;
-
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。