设计模式-策略模式

本文介绍了策略模式在处理程序中不断增长的条件判断中的应用,通过将if-else结构替换为策略类,实现代码的可扩展性和可读性。策略模式如何提高代码维护性,以及其优缺点分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计模式-策略模式

应用场景

在写程序时,经常会出现if和switch语句加入新的条件,并且这么新条件以后还有可能增加,那么可以考虑使用策略模式。

类图

在这里插入图片描述

举例

一般写法

enum TaxBase {
	CN_Tax,
	US_Tax,
	DE_Tax,
	FR_Tax      
    //...
};

class SalesOrder{
    TaxBase tax;
public:
    double CalculateTax(){
        //...
        
        if (tax == CN_Tax){
            //...
        }
        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(){}
};

//=================这里的方法代替if判断,有新情况直接在这里写=====================
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); 
        //...
    }
    
};

优点

1、代替if、switch语句;

2、代码优雅、可复用、可读性好;

3、符合开闭原则,扩展性好、便于维护;

4、只需编译新加入的策略;

缺点

1、策略如果很多的话,会造成策略类膨胀;

2、使用者必须清楚所有的策略类及其用途;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长不大的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值