• 技术文章 >后端开发 >C#.Net教程

    C++设计模式浅识策略模式

    黄舟黄舟2017-01-18 15:05:57原创567
    策略模式定义:

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

    策略模式包含如下角色:

    Context:环境类

    Strategy:抽象策略类

    ConcreteStrategy: 具体策略类

    UML类图:

    341.jpg

    php入门到就业线上直播课:进入学习

    测试用例

    [code]int main(){
        //商品费用
        double cost;
        //采取某种收费策略之后的费用
        double result;
        //假如
        cost = 1029.88;
    
        //声明要使用的具体策略类
        //这里显示出了策略类的缺点:客户端必须知道有哪些具体封装的算法。如本例必须知道三种收费方式Normal、Return、Rebate。
        StrategyCashSuper *Normal = new ConerectStrategyNormal(cost);//抽象策略类(基类)指针指向派生类->具体策略类(普通收费方式)
        StrategyCashSuper *Return = new ConerectStrategyReturn(cost); //满300返100收费方式
        StrategyCashSuper *Rebate = new ConerectStrategyRebate(cost); //打八折收费
        //声明环境类,具体调用的算法,由它来维护
        Context *c = new Context();
        //设置使用的策略类
        c->setStrategy(Normal);//设置为普通收费
        //调用算法
        result = c->getChargeResult();
        std::cout << "Accrued expenses: " << result << std::endl;
    
        c->setStrategy(Return);//设置为满300返100收费方式
        //调用算法
        result = c->getChargeResult();
        std::cout << "Accrued expenses: " << result << std::endl;
    
        c->setStrategy(Rebate);//设置为打八折收费
        //调用算法
        result = c->getChargeResult();
        std::cout << "Accrued expenses: " << result << std::endl;
    
        return 0;
    }

    头文件Strategy.h

    [code]#ifndef _2STRATEGY_H_
    #define _2STRATEGY_H_
    //策略类,算法基类
    class StrategyCashSuper{
    protected:
        //商品应付费用,定义为保护成员供子类继承
        double cost;   
    public:
        //构造函数
        StrategyCashSuper(double c):cost(c){}
        //收费结果算法
        virtual double ChargeResult();//本想定义为纯虚函数,但不可以。因为虚基类本不能实例化
    };
    
    //正常收费算法
    class ConerectStrategyNormal: public StrategyCashSuper{
    public:
        //构造函数
        ConerectStrategyNormal(double c):StrategyCashSuper(c){}
        //根据本类的收费方式,重写继承的收费算法
        double ChargeResult()override;
    };
    
    //满300返100收费算法
    class ConerectStrategyReturn: public StrategyCashSuper{
    public:
        //构造函数
        ConerectStrategyReturn(double c):StrategyCashSuper(c){}
        //重写收费算法
        double ChargeResult()override;    
    };
    
    //打八折收费算法
    class ConerectStrategyRebate: public StrategyCashSuper{
    public:
        //构造函数
        ConerectStrategyRebate(double c):StrategyCashSuper(c){}
        //重写收费算法
        double ChargeResult()override;  
    
    };
    
    //环境类,根据具体算法,维护上下文使用的类
    class Context{
    private:
        //策略基类
        StrategyCashSuper *SCS;
    public:
        //设置使用的策略
        void setStrategy(StrategyCashSuper *s);
        //具体执行的算法
        double getChargeResult();
    };
    
    #endif

    实现Strategy.cpp

    [code]#include "2Strategy.h"
    //基类
    double StrategyCashSuper::ChargeResult(){
        return 0;
    }
    
    //正常收费
    double ConerectStrategyNormal::ChargeResult(){
        return cost;
    }
    
    //满300返100收费算法
    double ConerectStrategyReturn::ChargeResult(){
        double res = cost;
        if(res >= 300)
            res = cost - 100;
        return res;
    }
    //打八折收费算法
    double ConerectStrategyRebate::ChargeResult(){
        return cost *0.8;
    }
    
    //设置使用的算法
    void Context::setStrategy(StrategyCashSuper *s){
        SCS = s;
    }
    
    //具体执行的算法
    double Context::getChargeResult(){
        return SCS->ChargeResult();
    }

    总结:

    策略模式让算法独立于使用它的客户而变化,也成为政策模式。策略模式是一种对象行为型模式。

    策略模式包含3个角色:抽象策略类为所支持的算法声明了抽象方法,是所有策略类的父类;具体策略类实现了在抽象策略类中定义的算法。环境类在解决某个问题时可以采用多种策略类(缺点是客户端需要知道所有封装的策略类),在环境类中维护一个对抽象策略类的引用实例。

    策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法封装到一系列的策略类里面,作为一个抽象策略类的子类。

    策略模式主要优点在于对“开闭原则”的完美支持,在不修改原有系统的基础上可以更换算法或者增加新的算法,它很好的管理算法家族,提高了代码的复用性,是一种替换继承,避免多重条件转移语句的实现方式;其缺点在于客户端必须知道所有的策略类,并理解其区别,同时在一定程度上增加了系统中类的个数,可能会存在很多策略类。

    策略模式适用情况包括:在一个系统里面有许多类,它们之间的区别仅在于它们的行为,使用策略模式可以动态地让一个对象在许多行为中选择一种行为;一个系统需要动态地在几种算法中选择一种;避免使用难以维护的多重条件选择语句;希望在具体策略类中封装算法和与之相关的数据结构。

    以上就是C++设计模式浅识策略模式的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    快捷开发Web应用及小程序:点击使用

    支持亿级表,高并发,自动生成可视化后台。

    上一篇:C++设计模式浅识简单工厂模式 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• 解决asp.net中“从客户端中检测到有潜在危险的Request.Form值”的错误• asp.net 图片验证码的HtmlHelper• ASP.NET使用Ajax如何返回Json对象的方法具体介绍• C/C++深度分析• SUNWEN教程之----C#进阶(二)
    1/1

    PHP中文网