当前位置: 首页 > news >正文

“组件协作”模式之策略模式

目录

  • 策略模式
    • 引例
    • 动机 Motivation
    • 模式定义
    • 结构
    • 要点总结

策略模式

引例

税务计算系统,根据各个国家的税法,进行税务计算。各个国家税法规定差别很大,需对应进行相应的实现。

  • 常规解耦前写法
    使用if-else语句或switch-case语句进行结构化分而治之且有增加的扩展变化需求可能,扩展新的需求不方便。
    // 税务类型 枚举类型
    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){// 美国税务计算实现}else if(tax == DE_Tax){// 德国税务计算实现...}// 增加拓展法国,以下为更改变化点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(StrateFactory* strateFactory){this->strategy = strategyFactory->NewStrategy();}~SalesOrder(){delete this->strategy;}double CalculateTax(){...Context context();double val = strategy->Calculate(context);	// 多态调用...}
    }
    

动机 Motivation

  • 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;有时支持不使用的算法也是一个性能负担。
  • 策略模式可以在运行时根据需要透明地更改对象的算法,将算法与对象本身解耦

模式定义

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

结构

在这里插入图片描述
红色部分为稳定部分,蓝色部分为变化部分。

要点总结

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

来源:极客班——C++设计模式入门

相关文章:

  • 做网站托管做好的网站怎么优化
  • 商业网站服务搜索引擎优化作业
  • 商丘简淘网络科技有限公司上海还能推seo吗
  • 如何修改网站备案的域名百度流量
  • 金华网站建设多少钱全网营销策划公司
  • 什么叫宣传型网站站点推广是什么意思
  • 【Python】图像+点云 结合显示
  • Part 0:射影几何,变换与估计-第二章:2D射影几何与变换(下)
  • 【看到哪里写到哪里】算闰年的(year 3) == 0
  • Selenium 二次封装通用页面基类 BasePage —— Python 实践
  • Windows下安装zookeeper
  • ros (二) 使用消息传递点云+rviz显示
  • web目录扫描-御剑
  • Redis跳表(skiplist)底层原理浅析
  • 使用亮数据网页抓取API自动获取Tiktok数据
  • matlab机器人工具箱(Robotics Toolbox)安装及使用
  • 【EDA软件】【应用功能子模块网表提供和加载编译方法】
  • 重置 MySQL root 密码
  • 前端面试专栏-主流框架:13.vue3组件通信与生命周期
  • webman 利用tcp 做服务端 对接物联网
  • C# LINQ语法
  • Boss:攻击
  • 【MQTT】常见问题
  • MySQL之视图深度解析
  • 第2章,[标签 Win32] :编写兼容多字节字符集和 Unicode 字符集的 Windows 程序
  • 【DevTools浏览器开发者工具反调试之无限Debugger跳过】