首页 > 其他 > 详细

设计模式二(策略模式)

时间:2020-09-23 00:34:38      阅读:114      评论:0      收藏:0      [点我收藏+]

一 模式定义:

  策略模式定义了算法族,分别封装起来, 让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户,在运行时方便的根据需要在各个算法之间进行切换。

二 结构模式:

技术分享图片

三 例如以下场景:

  计算税收时,每个国家的税收算法是不一样的,比如现在有要计算三个国家的税收,一般情况,不用设计模式时的代码:

技术分享图片
enum TaxBase
{
    CN_Tax,
    US_Tax,
    DE_Tax
};

class SalesOrder
{
public:
    TaxBase tax;
public:
    double CalculateTax()
    {
        if (tax = CN_Tax)
        {
            //中国税收的算法
        }
        else if (tax = US_Tax)
        {
            //美国税收的算法
        }
        else if (tax = DE_Tax)
        {
            //德国税收的算法
        }
    }
};
View Code

以上代码有个缺点,如果再要计算日本、韩国...等多个国家时,就得修改CalculateTax()函数里面添加的代码,并且给枚举里面添加。代码设计原则是尽量不要改动之前写过的代码,最好是扩展。例如以下代码用到策略模式:

技术分享图片
class TaxStrategy
{
    virtual double Calculate(const Context &context) = 0;
    virtual ~TaxStrategy(){}
};

class CNTax :public TaxStrategy
{
    virtual double Calculate(const Context &context)
    {
        //中国税收算法
    }
};

class USTax :public TaxStrategy
{
    virtual double Calculate(const Context &context)
    {
        //美国税收算法
    }
};

class DETax :public TaxStrategy
{
    virtual double Calculate(const Context &context)
    {
        //德国税收算法
    }
};

class SalesOrder
{
public:
    SalesOrder(StrategyFactory *strategyFactory)
    {
        this->strategy = strategyFactory->NewStratety;     //根据不同需求,用工厂模式产生不同的对象
    }
    ~SalesOrder()
    {
        delete this->strategy;
    }
public:
    double CalculateTax()
    {
        strategy->Calculate(context);     //在运行时方便的根据需要在各个算法之间进行切换
    }

private:
    TaxStrategy *strategy;
};
View Code

 

设计模式二(策略模式)

原文:https://www.cnblogs.com/zwj-199306231519/p/13715639.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!