• 策略模式


    动机( Motivation )
    >在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂,而且有时候支持不使用的算法也是一个性能负担。
    >如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题?

    普通结构式程序:

    enum TaxBase{
        CN_Tax,
        US_Tax,
        DE_Tax,
    
        //改动
        FR_Tax
    };
    
    class SaleOrder{
        TaxBase tax;
    public:
        double CalculateTax()
        {
            if (tax == CN_tax){
                //CN***********
            }
            else if (tax == US_Tax)
            {
                //CN***********
            }
            else if (tax == DE_Tax)
            {
                //DE***********
            }
    
            //改动
            else if (tax == FR_Tax)
            {
                //FR***********
            }
            //.........
        }
    };

    策略模式代码

    class TaxStrategy{
    public:
        virtual double Calculate(const context& context) = 0;
        virtual ~TastStrategy(){}
    };
    
    class CNTex :public TaxStrategy{
    public:
        virtual double Calculate(const Context& context){
            //****************
        }
    };
    
    class USTax :public TaxStrategy{
    public:
        virtual double Calculate(const Context& context){
            //****************
        }
    };
    
    class DETax :public TaxStrategy{
    public:
        virtual double Calculate(const Context& context){
            //****************
        }
    };
    
    //**********扩展************
    class FRTax :public TaxStrategy{
    public:
        virtual double Calculate(const Context& context){
            //****************
        }
    };
    //***************************
    
    
    
    //复用性,不需要更改
    class SalesOrder{
    private:
        TaxStrategy* strategy; //多态指针
    public:
        SalesOrder(StrategyFactory* strategyFactory){
            this->strategy = strategyFactory->NewStrategy();
        }
        ~SalesOrder(){
            delete this->strategy;
        }
        public double ClaculateTax(){
            //.....
            Context context();
    
            double val = strategy->Calculate(context); //多态调用
            //.....
        }
    };
  • 相关阅读:
    c#之继承
    javascript post数据到WCF反馈json或者XML
    五:理解控件的运行机制(例:基于Control命名空间的简单控件)
    c#之委托和事件
    项目管理中的十一个原则
    Linq:基本语法group by, order by ,into(3)
    Linq:基本语法form ,select, where(2)
    PL/SQL学习笔记视图
    七:理解控件的运行机制(例:基于CompositeControl命名空间的控件)
    PL/SQL学习笔记常量变量及数据类型初步
  • 原文地址:https://www.cnblogs.com/zhuifeng-mayi/p/11056905.html
Copyright © 2020-2023  润新知