栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ 策略模式

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ 策略模式

一、定义:定义一系列算法(将算法定义为虚函数,子类重写它),将它们封装起来,并使他们可互相替换(变化)。

二、应用场景:在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担(例如if/else条件判断语句有很多判断语句不会被执行)。

三、解决什么问题:在运行时根据需要透明地更改对象的算法;将算法与对象本身解耦。

原始代码设计(伪代码):

enum TaxBase {
    CN_Tax,
    US_Tax,
    DE_Tax,
    FR_Tax       //更改
};

class SalesOrder{
    TaxBase tax;
public:
    double CalculateTax(){
        //...
        
        if (tax == CN_Tax){
            //CN***********
        }
        else if (tax == US_Tax){
            //US***********
        }
        else if (tax == DE_Tax){
            //DE***********
        }
        else if (tax == FR_Tax){  //更改
            //...
        }

        //....
     }
    
};

加入策略设计模式之后的代码(伪代码):

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(){
        //...
        CNTax context();
        
        double val = strategy->Calculate(context); //多态调用
        //...
    }
    
};
 

总结:使用继承,将算法通过纯虚函数向子类中进行传递,每个子类都可以单独进行实现,在使用算法时便可以准确调用对应的函数,不需要包含不需要使用到的算法。在使用对条件判断语句进行替换的时候,策略模式可能是一个不错的选择。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/836113.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号