• C++设计模式之Strategy策略模式


    1.“组件协作”模式:

    现代软件专业分工之后第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。

    典型模式

    • Template Method
    • Startegy
    • Observer / Event

    2.动机(Movivation)

    在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会是对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。

    如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题?

    3.模式定义

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

    4.普通模式代码

    enum TaxBase {
    	CN_Tax,
    	US_Tax,
    	DE_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**********
    		}
    
    		//....
    	}
    };
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    5.Strategy模式代码

    开放封闭原则(OCP

    • 对扩展开放,对更改封闭
    • 类模块应该是可扩展的,但是不可修改

    复用:代码编译,测试之后原封不动,而不是代码级别片段式的粘贴,满足开闭原则,是一种扩展的方式;

    • eg:普通代码支持扩展通过增加enum和if else(往往这种方法会影响其他if else);Strategy模式代码是继承一个父类,去重写Calculate;

    在这里插入图片描述

    
    class TaxStrategy {
    public:
    	virtual double Calculalte(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 SlaesOrder {
    private:
    	TaxStrategy* strategy;
    
    public:
    	SalesOrder(StrategyFactory* strategyFactory) {
    		this->strategy = strategyFactory->NewStrategy();
    	}
    	~SalesOrder() {
    		delete this->strategy;
    	}
    
    	public double CalculateTax() {
    		//...
    		Context context();
    		double val = strategy->Calculalte(context);
    		//...
    	}
    
    };
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    6.结构

    Strategy一般放一个方法

    • 红色是稳定的,蓝色是变化的
      在这里插入图片描述

    7.要点总结

    Strategy及其子类为组件提供了一系列可重用的算法,从而可以使得类型在运行时(虚函数)方便地根据需要在各个算法之间进行切换。

    Strategy模式提供了用条件判断语句以外的另一种选择,消除条件判断语句,就是在解耦合。含有许多条件判断语句的代码通常都需要Strategy模式。

    如果Strategy对象没有实例变量,那么各个上下文可以共享同一个Strategy对象,从而节省对象开销。

  • 相关阅读:
    学之思开源考试系统部署至Centos7
    C++学习6-类和对象
    Jackson ImmunoResearch 直接和间接蛋白质印迹方案
    达梦数据冲刺科创板:拟募资24亿 冯裕才曾为华科教授
    HZOJ-251:士兵
    免费的百度官网认证怎么搞?什么单位官网认证免费?
    react原理学习
    【SDX12】高通SDX12 NatType功能分析及实现
    通过工具和字节码带你深入理解运行时数据区
    Servlet 项目的创建和部署
  • 原文地址:https://blog.csdn.net/u011436427/article/details/126563712