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

设计者模式之策略模式

前言

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

如何在运行时根据需要透明地更改对象的算法,将对象和算法解耦?

举例:不同国家税率的计算,新的需求是新增一个国家税率的计算。

不好的做法:增加一个if else

好的做法:定义一个新类(扩展),实现虚函数,以此来实现不同的税率计算。

策略模式的定义

定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。

策略模式结构

在这里插入图片描述

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); //多态
        //...
    }
    
};


http://www.kler.cn/a/383659.html

相关文章:

  • 电脑丢失bcrypt.dll文件是什么原因?找不到bcrypt.dll文件修复办法来啦!
  • 【视觉SLAM:八叉树地图(Octree Map)概述】
  • docker安装nginx,docker部署vue前端,以及docker部署java的jar部署
  • 3D架构图软件 iCraft Editor 正式发布 @icraftplayer-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
  • 基于SpringBoot的山西文旅网系统
  • GESP CCF C++八级编程等级考试认证真题 2024年12月
  • 《构建一个具备从后端数据库获取数据并再前端显示的内容页面:前后端实现解析》
  • 集中管理用户名和密码,定期修改密码快捷方便
  • 参数跟丢了之JS生成器和包装器
  • PostgreSQL核心揭秘(三)-元组结构
  • 【科普】conda、virtualenv, venv分别是什么?它们之间有什么区别?
  • 讲讲RabbitMQ 性能优化
  • Qt中弹出窗口的实现与鼠标事件处理
  • ctfshow(91,96,97)--PHP特性
  • Spring Boot 中Nacos的用法及流程
  • lua入门教程 :模块和包
  • 【C++】vector 类深度解析:探索动态数组的奥秘
  • Hive面试题-- hive中查询用户连续三天登录记录的实现与解析
  • 【码农日常】Vscode Clangd初始化失败(Win10)
  • M1M2 MAC安装windows11 虚拟机的全过程
  • CSS中常见的两列布局、三列布局、百分比和多行多列布局!
  • 13.React useTimeout
  • 服务器虚拟化:现代IT基础设施的基石
  • 【660】基于SSM+Vue的在线学习系统设计与实现
  • 数据库_SQLite3
  • 防止事件冒泡和防止触发子元素