【设计模式二】策略模式

本文介绍了策略模式在解决ifelse问题上的应用,通过将不同国家的税费计算策略抽象为独立的类,实现了代码的开闭原则。策略模式使得在添加新的国家税费算法时无需修改原有代码,提高了代码的可维护性和执行效率。同时,文章提到了使用工厂模式创建策略对象,并展示了如何在`SalesOrder`类中通过多态调用策略,避免了冗余的ifelse判断。
摘要由CSDN通过智能技术生成

策略模式

简单来说就是不同的子类调用相同的函数名,执行不同的代码段(通过this指针类型确定要执行的函数)

策略模式往往用于解决违反开闭原则的代码,为if else提供了另一种选择。
也就是说,出现if else就可以考虑用策略模式了,如果if else里的动作是针对的不同类型,那90%就应该用策略模式。
假如我们需要计算不同国家的税费,一般是通过枚举来实现:

enum TaxBase {  // 不同的国家有不同的算法
	CN_Tax,
	US_Tax,
	DE_Tax,
	FR_Tax       //更改
};

class SalesOrder{
    TaxBase tax;
public:
    // 设计模式大忌,不要用if else 去处理不同的类
	// 因为新增或删除一个类,if else就得更改,
	// 违反了开闭原则:对扩展开放,对修改关闭(新增一个类不用更改其他代码)
    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(){
        //...
        Context context();
        //多态调用,落脚点,根据不同的国家调用对应的方法
        double val = strategy->Calculate(context); 
        //...
    }
};

策略模式是一种关联性模式,针对不同的对象,采用不同的方法,其类图如下:
在这里插入图片描述
tip:其实策略模式还有个附带的价值,回到第一段代码,即使我们主要的只计算中国和美国的税费,if else会把所有国家的类型都判断一遍,执行效率低下,而策略模式就解决了这个问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值