• 大话设计模式


    感觉可以和工厂模式一起用:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户.策略模式是一种定义一系列算法的方法,从概念上看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合.

    策略模式的  基类 层次为Context定义了一系列的可供重用的算法或行为。策略模式的优点是简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试.

    当不同的行为堆砌在一个类中时,就很难避免使用条件语句来选择合适的行为。将这些行为封装在一个一个独立的Strategy类中,可以在使用这些行为的类中消除条件语句.

    策略模式就是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则.

    只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这话总变化的可能性.

    在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象.

    此处和工厂模式很类似的一个实例:

    #pragma once
    class CashSuper
    {
    public:
        virtual double acceptCash(double money)=0;
        CashSuper(void);
        ~CashSuper(void);
    };
    #pragma once
    //不打折扣的情况
    #include "cashsuper.h"
    class CashNormal :
        public CashSuper
    {
    public:
        virtual double acceptCash(double money)
        {
            return money;
        }
        CashNormal(void);
        ~CashNormal(void);
    };
    #pragma once
    //打折扣的情况
    #include "cashsuper.h"
    class CashRebate :
        public CashSuper
    {
    public:
        CashRebate(double rebate=1.0):moneyRebate(rebate){}
        virtual double acceptCash(double money)
        {
            return money*moneyRebate;
        }
        ~CashRebate(void);
    private:
        double moneyRebate;
    };
    #pragma once
    //满多少减多少的情况
    #include "cashsuper.h"
    class CashReturn :
        public CashSuper
    {
    public:
        CashReturn(double condition=0.0,double returns =0.0):moneyCondition(condition),moneyReturn(returns){}
        virtual double acceptCash(double money)
        {
            double result = money;
            if(money>=moneyCondition)
                result = money-(money/moneyCondition)*moneyReturn;
            return result;
        }
        ~CashReturn(void);
    private:
        double moneyCondition;
        double moneyReturn;
    };
    #pragma once
    #include "CashSuper.h"
    #include "CashNormal.h"
    #include "CashRebate.h"
    #include "CashReturn.h"
    class CashContext
    {
    public:
        CashContext(int type)
        {
            switch(type)
            {
            case 1:
                cs = new CashNormal();
                break;
            case 2:
                cs = new CashReturn(300,100);
                break;
            case 3:
                cs = new CashRebate(0.8);
                break;
            }
        }
        double GetResult(double money)
        {
            return cs->acceptCash(money);
        }
        ~CashContext(void);
    private:
        CashSuper *cs;
    };

    调用:

    #include "stdafx.h"
    #include <iostream>
    #include "CashContext.h"
    using namespace std;
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        //1.原价
        CashContext *csupe = new CashContext(1);
        cout<<csupe->GetResult(56.4)<<endl;
        //2.满300返100
        csupe = new CashContext(2);
        cout<<csupe->GetResult(300)<<endl;
        //3.打八折
        csupe = new CashContext(3);
        cout<<csupe -> GetResult(400)<<endl;
        return 0;
    }

    输出结果: 56.4     200    320

  • 相关阅读:
    properties to json (通过前缀手动创建json, bean) propsutils
    Drill 常用时间函数 drill
    ubuntu20.04 修改 DNS  ip
    javascript 获取图片的尺寸 how to get image size using javascript
    javascript小数点后保留N位并可以四舍五入
    C# 递归算法求 1,1,2,3,5,8,13···
    自加入屠龙后的成长记
    Session丢值的问题
    第二个网站成长经历,http://www.chaomagou.com/ 潮妈购
    回想自己2012年1月1日到2012年6月19日的所作所为
  • 原文地址:https://www.cnblogs.com/crazycodehzp/p/3701467.html
Copyright © 2020-2023  润新知