设计模式学习(二)————策略模式

来源:互联网 发布:js去重方法 编辑:程序博客网 时间:2024/06/02 00:33

在学习今天的设计模式之前,先要了解一个使用类的原则:

面向对象编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合集合才是类。

假如要实现一个商品价格收费的类,其中收费的策略有好几种,分别是普通金额,打折后金额,还有花费满一定金额返利。在类似实现这种情况的逻辑时,就可以使用策略模式!

策略模式:它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不好影响到使用算法的客户

首先我们可以定义收费的基类,然后根据几种收费策略来进行继承:

#ifndef CASHSUPER#define CASHSUPERclass CashSuper{public:    virtual ~CashSuper(){}    virtual double acceptMoney(double money) = 0;};class CashNormal final:public CashSuper{//protected:    double acceptMoney(double money) override    {        return money;    }};class CashRebate final:public CashSuper{    double moneyRebate = 1;public:    CashRebate(double rebate)    {        moneyRebate = rebate;    }//protected:    double acceptMoney(double money) override    {        return money*moneyRebate;    }};class CashReturn final:public CashSuper{    double moneyCondition = 0;    double moneyReturn = 0;public:    CashReturn(double mc,double mr)    {        moneyCondition = mc;        moneyReturn = mr;    }//protected:    double acceptMoney(double money) override    {        double result = money;        if(money >= moneyCondition)            result = money - (money/moneyCondition) * moneyReturn;        return result;    }};#endif // CASHSUPER

然后可以使用一个context类,将这些继承类封装起来然后在构造函数中实现继承类的挑选,界面逻辑所需要的结果也封装在这个context类中。

#ifndef CASHCONTEXT#define CASHCONTEXT#include <QString>#include "cashsuper.h"class CashContext    //策略模式,以相同的方式调用各种算法,减少各种算法类和使用算法类的耦合,结果抽象在getResult函数里返回//同时策略模式还简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试!修改任意一个算法不会影响其他算法!!{    CashSuper * cs;public:    CashContext(QString qs)   //策略模式封装了变化,判断在策略类的函数里面完成,但是还有更好的方法:反射技术(抽象工厂模式中再学!)    {        if(qs == QString::fromUtf8("正常收费"))        {            cs = new CashNormal();        }        else if(qs == QString::fromUtf8("打八折"))        {            cs = new CashRebate(0.8);        }        else if(qs == QString::fromUtf8("满300返100"))        {            cs = new CashReturn(300,100);        }    }    double getResult(double money)    {        return cs->acceptMoney(money);    }};#endif // CASHCONTEXT

这样,我们再简单做一个界面就看测试这个程序啦!界面程序请参考源代码。

最后方上源码地址:https://github.com/Dongzhixiao/designMode_qt/tree/master/shopPrice_strategy_pattern_2

0 0
原创粉丝点击