美文网首页
组件协作模式-策略模式

组件协作模式-策略模式

作者: 常春藤上的蜗牛 | 来源:发表于2018-01-08 23:51 被阅读0次

动机

在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂,而且有时候支持使用的算法也是一个性能负担。
如何在运行时根据需要透明的更改对象算法?将算法与对象本身解耦,从而避免上述问题?

模式定义

定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化)。该模式使得算法可以独立于使用它的客户程序(稳定)而变化(扩展,子类化)。

类图

策略模式

红框部分为稳定的,蓝框为变化的。

要点

Strategy及其子类为组件提供了一系列可重用的算法,从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换。
Strategy模式提供了用条件判断语句以外的另一种选择,消除条件判断语句,就是在解耦合。含有许多条件判断语句的代码通常需要用Strategy模式。
如果Strategy对象没有实例变量,那么各个上下文可以共享同一个Strategy对象,从而节省对象开销。

代码示例

//未使用设计模式
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(){
        //...
        Context context();
        
        double val = 
            strategy->Calculate(context); //多态调用
        //...
    }
    
};

基类中要添加一个虚析构函数,否则可能会出现问题
代码中的复用指的是编译单位的复用性。

相关文章

  • Boolan_C++设计模式第二周笔记

    上周讲述了DOF设计模式中的“组件协作”模式(包括template method模式、strategy策略模式、o...

  • Boolan_C++设计模式_第二周笔记

    上周讲述了DOF设计模式中的“组件协作”模式(包括template method模式、strategy策略模式、o...

  • 组件协作模式-策略模式

    动机 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常...

  • 设计模式

    设计模式的要点就是“寻找变化点,然后在变化点出应用设计模式,从而来更好的应对需求的变化” “组件协作”模式 “组件...

  • 组件化

    组件化 概况: 提高编译速度、提升协作效率、功能重用 代码重用和解耦 组件模式和集成模式切换 if (iMisMo...

  • (GeekBand)C++设计模式 第一周学习笔记

    Strategy模式 今天重点来介绍下Strategy模式。 作为三大经典“组件协作”模式之一的Strategy模...

  • 设计模式分类

    模式分类 组件协作 现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚绑定,来实现...

  • 用Swift整理GOF设计模式(二)--模板方法

    一、“组件协作”模式 概述:现代软件专业分工之后的第一个结果是划分出了框架和应用。而“组件协作”模式通过晚绑定,来...

  • 设计模式、框架、架构

    设计模式 工厂模式、适配器模式、策略模式等等 框架 一个框架可以包含多个设计模式。框架就是一组相互协作的类,对于特...

  • 类的关系

    【重点掌握】:设计模式定义、类关系、抽象封装具体、面向超类型编程 【重点掌握】:策略模式的参与角色、职责分配、协作...

网友评论

      本文标题:组件协作模式-策略模式

      本文链接:https://www.haomeiwen.com/subject/bqbinxtx.html