策略模式在数据接收和发送场景的应用(升级版)

1.背景

在数据接收和发送场景打算使用了 if else 进行判断:


if("A".equals(system)){
    ASystem.sync("向A同步数据");
}
if("B".equals(system)){
    BSystem.sync("向B同步数据");
}
...

非常麻烦,需求多了很臃肿

2.策略模式改进

2.1策略模式的定义:​​​​​

策略模式(Strategy Pattern)定义了一组同类型的算法,在不同的类中封装起来,每种算法可以根据当前场景相互替换,从而使算法的变化独立于使用它们的客户端(即算法的调用者)。

2.2策略模式的结构通常包括以下组成部分:

  1. 定义一个策略接口或抽象类:该接口或抽象类定义了所有策略类都需要实现的方法。
  2. 创建多个具体的策略类:每个具体的策略类都实现了策略接口或抽象类,并提供了不同的实现。
  3. 创建一个策略上下文类:该类负责使用策略,它通常会维护一个策略接口或抽象类的引用。
  4. 在客户端代码中使用策略上下文类:客户端代码可以根据需要选择不同的策略。

看定义有些抽象,下面的结构图应该会容易理解一些:

图片

2.3根据上面的结构,我们来实现一下我们的场景。

2.3.1.我们需要定义一个策略接口,定义与外部系统间交互都需要实现的方法

public interface DataProcessingStrategy {
    void receiveData();
    void sendData();
}

​​​​2.3.2.为每个外部系统创建一个策略类:

ASystem:

public class ASystemDataProcessingStrategy implements DataProcessingStrategy {
    @Override
    public void receiveData() {
        // 接收数据的具体实现
    }

    @Override
    public void sendData() {
        // 发送数据的具体实现
    }
}

BSystem:

public class BSystemDataProcessingStrategy implements DataProcessingStrategy {
    @Override
    public void receiveData() {
        // 接收数据的具体实现
    }

    @Override
    public void sendData() {
        // 发送数据的具体实现
    }
}

2.3.3.创建一个选择外部系统的策略类,用于在运行时根据需要选择合适的策略类

public class Context {
    private DataProcessingStrategy strategy;

    public Context(DataProcessingStrategy strategy) {
        this.strategy = strategy;
    }

    public void setStrategy(DataProcessingStrategy strategy) {
        this.strategy = strategy;
    }

    public void sendData(String data) {
        strategy.sendData(data);
    }

    public String receiveData() {
        return strategy.receiveData();
    }
}

2.3.4.最后,在需要调用外部系统同步数据的地方实例化相关策略类和上下文类,并调用executeStrategy方法:​​​​​​​

public class Main {
    public static void main(String[] args) {
        // 创建两个策略对象
        DataProcessingStrategy strategyA = new ASystemDataProcessingStrategy();
        DataProcessingStrategy strategyB = new BSystemDataProcessingStrategy();

        // 创建上下文对象,并传入策略对象
        Context context = new Context(strategyA);
        //使用 ASystemDataProcessingStrategy 请求和接收数据
        context.sendData("");  
        context.receiveData("");

        // 使用 BSystemDataProcessingStrategy 请求和接收数据
        context = new Context(strategyB);
        context.sendData("");  
        context.receiveData("");
    }
}

3.升级为策略模式+工厂模式

那么策略模式存在什么样的问题呢?

  1. 硬编码的依赖关系:在上述代码中,我们直接将具体的策略类(例如StrategyA和StrategyB)硬编码到上下文类(Context)中。这意味着如果我们想要添加或修改策略,我们需要在上下文类中修改代码。这种硬编码的方式使得系统难以扩展和维护。

  2. 客户端与策略的具体实现紧密耦合:由于上下文类Context直接依赖于具体的策略类,因此客户端代码必须了解每个具体策略的细节。这增加了客户端代码的复杂性,并使得客户端代码与策略的具体实现紧密耦合,增加了代码的维护难度。

我们可以使用工厂模式来改进我们的设计。工厂模式可以帮助我们将对象的创建和使用过程分离,使得上下文类和客户端代码不需要了解具体策略的细节,那么我们来修改一下我们的实现:​​​​​​​

context可以去除

// 策略接口和具体的策略类保持不变
public interface DataProcessingStrategy {
    void sendData(String data);
    String receiveData();
}

public class ASystemDataProcessingStrategy implements DataProcessingStrategy {
    @Override
    public void sendData(String data) {
        // 发送数据到系统A的实现
    }

    @Override
    public String receiveData() {
        // 从系统A接收数据的实现
    }
}

public class BSystemDataProcessingStrategy implements DataProcessingStrategy {
    @Override
    public void sendData(String data) {
        // 发送数据到系统B的实现
    }

    @Override
    public String receiveData() {
        // 从系统B接收数据的实现
    }
}

public class DataProcessingStrategyFactory {

   private static ConcurrentHashMap<String, DataProcessingStrategy> strategies = new ConcurrentHashMap<>();

   /**
    * 注册策略
    * @param strategyName
    * @param strategy
    */
   public static void register(String strategyName, DataProcessingStrategy strategy) {
       strategies.put(strategyName, strategy);
  }

   public static DataProcessingStrategy getStrategy(String strategyName) {
       return strategies.get(strategyName);
  }

}

//client类相关修改
public class Main {
    public static void main(String[] args) {
        DataProcessingStrategy systemA = DeployStrategyFactory.getStrategy("A");
        //使用 ASystemDataProcessingStrategy 请求和接收数据
        systemA.sendData("");  
        systemA.receiveData("");

        DataProcessingStrategy systemB = DeployStrategyFactory.getStrategy("B");
        // 使用 BSystemDataProcessingStrategy 请求和接收数据
        systemB.sendData("");  
        systemB.receiveData("");
    }
}

4.总结

在本篇文章中,我们介绍了策略模式,并在数据接收和发送场景中使用了策略模式。通过使用策略模式,我们可以在客户端代码中根据运行时条件动态地选择一个具体的策略类,并通过这个策略类来改变对象的行为。这样,我们就可以实现不同的数据接收和发送方式,而不需要在客户端代码中进行大量的if-else判断。同时通过策略模式+工厂模式的方式解决了客户端代码与策略的具体实现紧密耦合的问题。当然结合实际的场景灵活运用相应的设计模式也非常重要,避免过度设计

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

phpStorm Xdebug调试 加FireFox浏览器

步骤1&#xff1a; [Xdebug] zend_extension“D:\phpstudy_pro\Extensions\php\php5.4.45nts\ext\php_xdebug.dll” xdebug.collect_params1 xdebug.collect_return1 xdebug.remote_enableOn xdebug.remote_hostlocalhost xdebug.remote_port9001 xdebug.remote_handlerdbgp ;…

什么是Sectigo SSL证书

Sectigo SSL证书是由全球领先的网络安全公司Comodo和Symantec合并后成立的Sectigo公司所提供的一种数字证书。它能够为您的网站提供一个强大的安全套接字层&#xff08;SSL&#xff09;加密&#xff0c;确保您的网站与用户的数据传输过程中的安全性。 为什么选择Sectigo SSL证…

Django学习日志07

多表查询&#xff08;跨表查询&#xff09; 子查询&#xff1a;分步查询 链表查询&#xff1a;把多个有关系的表拼接成一个大表(虚拟表) inner join left join 展示左表所有数据数据&#xff0c;右表展示符合查询条件的数据&#xff0c;查询不到的用null填充 …

Flume学习笔记(2)—— Flume进阶

Flume进阶 Flume 事务 事务处理流程如下&#xff1a; Put doPut&#xff1a;将批数据先写入临时缓冲区putListdoCommit&#xff1a;检查channel内存队列是否足够合并。doRollback&#xff1a;channel内存队列空间不足&#xff0c;回滚数据 Take doTake&#xff1a;将数据取…

笔记54:门控循环单元 GRU

本地笔记地址&#xff1a;D:\work_file\DeepLearning_Learning\03_个人笔记\3.循环神经网络\第9章&#xff1a;动手学深度学习~现代循环神经网络 a a a a a a a

802.1Qbb

[TOC] 802.1Qbb 802.1Qbb是什么&#xff1f; 802.1Qbb&#xff08;基于优先级的流控制&#xff0c;PFC&#xff09;是以太网数据中心中一项重要的标准&#xff0c;用于提供无丢包的网络环境。这项标准是IEEE 802.1Q标准的一部分&#xff0c;旨在解决以太网数据中心网络中的拥…

基于共生生物算法优化概率神经网络PNN的分类预测 - 附代码

基于共生生物算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于共生生物算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于共生生物优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

C++语言的由来与发展历程

C语言的由来与发展历程可以追溯到1978年&#xff0c;当时美国电话电报公司&#xff08;AT&T&#xff09;的贝尔实验室发明了C语言&#xff0c;以满足UNIX操作系统的开发需求。在C语言的基础上&#xff0c;Bjarne Stroustrup于1983年创立了C编程语言&#xff0c;作为C语言的…

Linux 安装多版本 JDK 详细过程

背景说明 服务器已安装jdk1.8,但随着spring全家桶的升级换代&#xff0c;已不满足使用&#xff0c;先要用高版本jdk&#xff0c;暂时不想卸载旧的版本&#xff0c;故安装两个版本&#xff0c;jdk1.8和jdk17,jdk1.8的已经安装过了&#xff0c;所以此次只安装jdk17,以及配置jdk切…

homeassiant主题

下载主题 https://github.com/maartenpaauw/home-assistant-community-themes.git 使用file editor到homeassiant路径下&#xff0c;新建文件夹themes文件夹&#xff0c;用terminal新建也可以。 使用file editor上传文件 使用Terminal解压 mkdir themes unzip home-assistan…

振弦传感器表面钢筋计与振弦采集仪形成岩土工程监测的案例

振弦传感器表面钢筋计与振弦采集仪形成岩土工程监测的案例 振弦传感器和表面钢筋计是岩土工程监测中常用的仪器设备&#xff0c;可用于测量结构物的振动和变形情况&#xff0c;以及土体的变形和应力状态等。 以下是一个振弦传感器和表面钢筋计结合使用的案例&#xff1a; 在一…

【Python入门五】第三方库(包)介绍

Python第三方库/包介绍 前言安装方法 2 数据分析和处理netCDF4numpyxarray 3参考 前言 Python 的库分为2类。 标准库&#xff1a;不需要安装&#xff0c;需要导入。第三库&#xff1a;需要安装、需要导入。 Python的标准库中提供了许多有用的模块和功能&#xff0c;如字符串…

OpenCV技术应用(4)— 如何改变图像的透明度

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。本节课就手把手教你如何改变图像的透明度&#xff0c;希望大家学习之后能够有所收获~&#xff01;&#x1f308; 目录 &#x1f680;1.技术介绍 &#x1f680;2.实现代码 &#x1f680;1.技术介绍 改变图像透明度的实…

Flink(六)【DataFrame 转换算子(下)】

前言 今天学习剩下的转换算子。 1、物理分区算子 常见的物理分区策略有随机分配&#xff08;Random&#xff09;、轮询分配&#xff08;Round-Robin&#xff09;、重缩放&#xff08;Rescale&#xff09;和广播&#xff08;Broadcast&#xff09;&#xff0c;下边我们分别来做…

【TEC100TAI-KIT】青翼科技基于复微青龙JFMQL100TAI的全国产化智能异构计算平台

板卡概述 TEC100TAI-KIT是我司自主研制的一款基于上海复旦微电子复微青龙100TAI的全国产智能异构计算平台开发套件&#xff0c;该套件包含1个复微青龙100TAI核心板和1个PCIE规格的扩展底板。 该套件的核心板集成了100TAI的最小系统&#xff0c;包含一颗JFMQL100TAI900片上系统…

《网络协议》08. 概念补充

title: 《网络协议》08. 概念补充 date: 2022-10-06 18:33:04 updated: 2023-11-17 10:35:52 categories: 学习记录&#xff1a;网络协议 excerpt: 代理、VPN、CDN、网络爬虫、无线网络、缓存、Cookie & Session、RESTful。 comments: false tags: top_image: /images/back…

网络规模与性能优化的一篇随笔

本周写篇轻松的话题&#xff0c;注意信息传输的尺度和缩放比例&#xff0c;写篇随笔。 控制面和数据面随规模缩放的影响&#xff0c;举几个例子就能说明白。 CSMA/CD&#xff0c;控制面和数据面在一起&#xff0c;控制信息交互时延和数据面时延在同一尺度时&#xff0c;就到了…

视频制作技巧:添加srt字幕,批量剪辑,省时省力

随着社交媒体的兴起&#xff0c;视频制作越来越成为人们表达自我、分享经验的重要方式。然而&#xff0c;视频制作需要耗费大量的时间和精力。在视频制作中&#xff0c;字幕是非常重要的元素&#xff0c;可以帮助观众更好地理解视频内容。而SRT字幕则是一种更为先进的字幕技术&…

计算机毕业设计选题推荐-高校后勤报修微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

分发糖果(贪心算法)

题目描述 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&#xff0c;计算并返回…