[设计模式]策略模式

Posted onetrainee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[设计模式]策略模式相关的知识,希望对你有一定的参考价值。

[设计模式]策略模式

所谓策略模式,就是一个类的行为或算法可以在运行时更改。

常见的策略模式是在if··else if··· 这种语句下,且其if的需求是不断变动的。

 

1. 反例代码

  这是一个税率计算器,根据各国的税率进行计算。说实话,如果我没学设计模式,我很可能就是写出如下代码,但是在使用设计模式之后,你会发现代码如此简洁。

  弊端非常明显,就是一旦你有了新的需求,就必须更改源码,另外,还有一个非常严重的就是大量if判断会严重占用内存。

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){  //更改
            //...
        }

        //....
     }
    
}; 

 

2. 策略模式

  我们修改上面代码的方法是使用策略方法,其核心原则是虚类在创建时动态绑定,至于绑定的对象,我们使用工厂方法来生产对应的策略。

   技术图片

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); //多态调用
        //...
    }
    
};

 

 

3. 一个实例化样例

#include <iostream>
using namespace std;

// 税率策略类
class TaxStrategy {
public:
    virtual    double Calculate(const int& income) = 0; // 虚函数 
    virtual ~TaxStrategy() {}  // 基类的虚构函数必须使用虚函数
};

// 实例化中国的税率策略
class ChineseTaxStrategy : public TaxStrategy {
public:
    virtual double Calculate(const int& income) {
        return income * 1.1;
    }
};

// 实例化日本的税率策略
class JapaneseTaxStrategy : public TaxStrategy {
public:
    virtual double Calculate(const int& income) {
        return income * 1.2;
    }
};

// 税率工厂基类,具体产出使用哪一个类 
class StrategyFactory {
public:
    virtual TaxStrategy* CreateStrategy()=0;
    virtual ~StrategyFactory() {}
};

// 中国税率工厂
class ChineseStrategyFactory :public StrategyFactory {
public:
    virtual TaxStrategy* CreateStrategy() {
        return new ChineseTaxStrategy();
    }
};

//    日本税率工厂
class JapaneseStrategyFactory :public StrategyFactory {
public:
    virtual TaxStrategy* CreateStrategy() {
        return new JapaneseTaxStrategy();
    }
};

// 税率计算器
class SalesOrder {
private:
    TaxStrategy* strategy; // 待定使用哪一种计算方法
public:
    SalesOrder(StrategyFactory* strategyFactory) {
        this->strategy = strategyFactory->CreateStrategy(); 
    }
    double calc(const int& income) {
        return strategy->Calculate(income);
    }
    ~SalesOrder() {
        delete strategy;
    }
};

// 主函数
int main() {
    // 使用中国税率来进行计算
    ChineseStrategyFactory* p= new ChineseStrategyFactory();
    SalesOrder calculator(p);
    cout << calculator.calc(123) << endl;
}

 

以上是关于[设计模式]策略模式的主要内容,如果未能解决你的问题,请参考以下文章

Redis实现分布式锁(设计模式应用实战)

设计模式策略模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

代码片-策略模式+工厂模式

代码片-策略模式+工厂模式

代码片-策略模式+工厂模式

代码片-策略模式+工厂模式