设计模式——组件协作模式之策略模式

news2024/11/24 3:29:03

文章目录

  • 前言
  • 一、“组件协作” 模式
  • 二、Strategy 策略模式
    • 1、动机
    • 2、模式定义
    • 3、代码示例
    • 4、结构
  • 要点总结


前言


一、“组件协作” 模式

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

二、Strategy 策略模式

1、动机

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

2、模式定义

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

3、代码示例

下面假设这样一个场景,比如说我们在电子商务系统中常常需要做订单的计算,订单计算中常常有金额、交易等等计算,此外还有一个很重要的是的计算,假如我们支持跨国计算的话,那么这里就需要考虑不同国家税的算法的不同,现在在已有中国、美国和德国计算税的基础上增加一个支持德国的税计算算法。
下面展示两种方法的伪代码:

strategy1.cpp

//strategy1.cpp
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){  //更改
            //...
        }
 
        //....
     }
    
};
//说明:这种方式更改的时候违反了开放封闭原则

strategy2.cpp

//strategy2.cpp
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); //多态调用
        //...
    }
};
 
//说明:这种方式扩展的时候遵循了开放封闭原则
  • 复用指的是编译后二进制意义的复用,而不是简单的代码片段的复用。
  • SalesOrder 和 TaxStrategy是稳定的,各种XXTax 是变化的。

4、结构

在这里插入图片描述

【注】:

  • Context 和 Strategy 是稳定的
  • ConcreteStrategyX 是变化的

要点总结

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

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

    【注】:绝对稳定不变的情况可以用if-else,如一周七天,而其他的可能变化条件判断的情况就要用Strategy模式。代码示例中的第一种写法的很多条件判断代码可能根本不会执行,但是却被迫装载到了CPU高级缓存中,占用了缓存位置,其他代码可能被挤出高级缓存,不得不装载到硬盘;而第二种写法则不会有这个问题,减轻了性能负担,但这不是Strategy模式的最大优势,Strategy模式的最大优势是用扩展应对变化。看到条件判断的情况,都要考虑能不能使用Strategy模式。】

  • 如果 Strategy 对象没有实例变量,那么各个上下文可以共享同一个 Strategy 对象,从而节省对象开销。【注:一般可以使用单例模式】

我的qq:2442391036,欢迎交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/457137.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【内网】WebStorm搭建Vue环境

文章目录 安装node.js和npm1、 Node.js和npm简介2、下载Node.js3、安装Node.js4、检查是否安装成功5、环境配置(很重要!)6、配置内网离线库 安装WebStorm并运行Vue项目1、新建项目2、测试 安装node.js和npm 1、 Node.js和npm简介 简单的说 …

阿里云服务器-Linux

说明:自己想玩一下服务器,记录一下服务器安装的环境以及软件。包括JDK,Mysql,tomcat等。 一:JDK篇 服务器上也是需要安装JDK环境的,跑不掉的。阿里云服务器提供了命令安装,固定安装目录自动配…

【Jmeter】Oracle数据迁移,批量插入测试数据~

前言~1.准备事项1.1 梳理脚本 2.动起手来2.1 了解 JDBC Connection Configuration2.2 配置 JDBC请求 3.生成测试链路3.1 获取表主键信息3.2 获取目标表表结构3.3 拼接数据并生成sql3.4 插入数据 4.优化脚本(主键信息4.1 添加Beshell后置处理器4.2 优化拼接数据请求&…

C++类与对象——this指针

文章目录 概述this指针的引出this指针的特性将this指针用于多个对象的比较this指针可以为空吗? 概述 本篇博客主要讲解C类和对象模块中的this指针的知识,将会深入探究this指针的使用细节即使用时需要注意的点,并且简单讲解一下底层的实现原理…

Maven(五):Maven的使用——依赖的测试

Maven(五):Maven的使用——依赖的测试 前言一、实验六:测试依赖的范围1、依赖范围1.1 compile 和 test 对比1.2 compile 和 provided 对比1.3 结论 二、实验七:测试依赖的传递性1、依赖的传递性1.1 概念1.2 传递的原则…

内网渗透之横向移动rdpwinrmwinrsspnkerberos

0x00 准备 环境:god.org cs上线 win2008web 提权利用ms14-058 抓取hash和明文密码(当获取到其他主机就重复提权和抓取密码) 扫描存活主机,扫描端口 代理转发-转发上线,生成反向连接木马,绑定监听器,上传至web根目录(方…

hardhat 本地连接matemask钱包

Hardhat 安装 https://hardhat.org/hardhat-runner/docs/getting-started#quick-start Running a Local Hardhat Network Hardhat greatly simplifies the process of setting up a local network by having an in-built local blockchain which can be easily run through a…

制作一个高质量的FAQ页面需要考虑哪些因素?

作为现代企业不可缺少的知识库,FAQ页面(Frequently Asked Questions)是集中呈现重要信息供用户查询和解决问题的权威场所。如果您在网站上提供了不错的产品或服务,很多客户都会通过访问FAQ页面找到他们需要的答案。 在设计和创建…

Linux Ansible安装以及环境搭建

Ansible介绍 Ansible是一种基于Python的自动化配置工具,通过OpenSSH的方式管理被管理节点,实现批量系统配置、批量程序部署、批量运行命令等功能。 当管理节点需要管理被管理节点时,只需要在管理节点安装ansible,无需在被管理节…

23种设计模式-代理模式

代理模式 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。 介绍 意图:为其他对象提供…

【KingSCADA】什么是精灵图以及如何创建精灵图

大家好,我是雷工! 本篇学习精灵图的制作,以下为学习内容及相关笔记。 一、什么是精灵图 精灵图是一种在外观上类似组合图,但内部嵌入了比较丰富的动画链接与逻辑控制,工程开发人员只要将其从精灵图库中调出来放置在开…

[Netty] Mpsc Queue (十七)

JCTools 是适用于 JVM 并发开发的工具,主要提供了一些 JDK 确实的并发数据结构,例如非阻塞 Map、非阻塞 Queue 等。其中非阻塞队列可以分为四种类型,可以根据不同的场景选择使用。 Spsc 单生产者单消费者Mpsc 多生产者单消费者Spmc 单生产者…

大模型(LLM)训练微调综述学习

总览 介绍大模型训练的微调方法,包括prompt tuning、prefix tuning、LoRA、p-tuning和AdaLoRA等。介绍使用deepspeed和LoRA进行大模型训练的相关代码。给出petals的介绍,它可以将模型划分为多个块,每个用户的机器负责其中一块,分…

PS学习记录-PPI与DPI

先说两者的重点: dpi是印刷图像时候用的,ppi是设计图像时候用的dpi:【点/英寸】 是印刷计量单位,是每英寸上所印刷的【墨点数】,打印图片一般300dpi左右,代表打印的解析度。ppi:【像素/英寸】是…

快速精通Git

一、 版本控制工具 1.1. 什么是版本控制系统? 版本控制系统(Version Control System):是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。版本控制系统不仅可以应用于软件源代码的文本文件,而且…

温度调制式差示扫描量热法(MTDSC)中的正弦波温度控制技术

摘要:在调制温度式差式扫描量热仪(MTDSC)中,关键技术之一是正弦波加热温度的实现,此技术是制约目前国内无法生产MTDSC量热仪的重要障碍,这主要是因为现有的PID温控技术根本无法实现不同幅值和频率正弦波这样…

uie-base使用记录(paddlenlp)

参考文章:https://aistudio.baidu.com/aistudio/modelsdetail?modelId22 参考文章:https://paddlenlp.readthedocs.io/zh/latest/FAQ.html 参考文章:https://developer.aliyun.com/article/1066857 参考文章:https://github.com/…

【计算机基本原理-数据结构】八大数据结构分类

【计算机基本原理-数据结构】八大数据结构分类 1)数组2)链表3)队列4)栈5)树6)图7)堆8)散列表(哈希表) 数据结构是计算机存储、组织数据的方式。一种好的数据结构可以带来更高的运行或…

Java基础(十三)系统相关类

1. 系统相关类 1.1 java.lang.System类 System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。该类位于java.lang包。 由于该类的构造器是private的,所以无法创建该类的对象。其内部的成员变量和成员方法都是static的,所以也可…

Netty(一)深入Hotspot源码与Linux内核理解NIO与Epoll

深入Hotspot源码与Linux内核理解NIO与Epoll 前言介绍Netty 的介绍Netty 的应用场景理解阻塞和同步关键字初始BIO、NIO、AIOBIO(Blocking IO)缺点:应用场景: NIO(Non Blocking IO)应用场景:NIO非阻塞代码示例存在的问题 NIO 有三大核心组件&am…