zoukankan      html  css  js  c++  java
  • 四:Strategy 策略模式(税法的计算)

    1动机(Motivation:

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

    2)模式定义

    定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子类化)。

    3Strategy及其子类为组件提供了一系列可重用的算法,从而可以使

    得类型在运行时方便地根据需要在各个算法之间进行切换。Strategy模式提供了用条件判断语句以外的另一种选择,消除条件判断语句,就是在解耦合。含有许多条件判断语句的代码通常都需要Strategy模式。如果Strategy对象没有实例变量,那么各个上下文可以共享同一个Strategy对象,从而节省对象开销。

    示例:
    
    class TaxStrategy{
    public:
        virtual double Calculate(const Context& context)=0;
        virtual ~TaxStrategy(){}
    };
    
    
    class CNTax : 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 CalculateTax(){
            //...
            Context context();
            
            double val = 
                strategy->Calculate(context); //多态调用
            //...
        }
        
    };
  • 相关阅读:
    常遇问题及解决
    cs231笔记1
    scikit-learn模型参数保存和多分类策略(one vs one和one vs rest)
    练习1_scikit_learn自带数据集_sklearn和svm
    记一次连不上wifi网的处理
    剑指offer | 从1到n整数中1出现的次数 | 22
    剑指offer | 数组中出现次数超过一半的数字 | 21
    剑指offer | 不用加减乘除做加法 | 20
    剑指offer | 二进制中1的个数 | 19
    剑指offer | 链表中环的入口结点 | 18
  • 原文地址:https://www.cnblogs.com/love-life-insist/p/12904958.html
Copyright © 2011-2022 走看看