设计模式及其在项目、框架中的应用

设计模式的作用:

1、类之间关系图,明确的角色及其关系、作用;

2、符合开闭原则,职责明确,并且开放的拓展点可以有效应对后期的变化。

(一)、责任链模式

适用场景:
在一个流程中,对某一个对象有一串不同的业务处理操作,可以把这些业务操作封装成一个抽象业务的不同实现类,便于在链路中动态添加处理逻辑。

类图分析:

角色:请求者 处理者 处理者链路

举例:
1、快麦erp,订单进入系统后,需要进行一系列的后续处理动作:敏感信息加密、分配赠品、匹配仓库、物流方式、锁定库存,这些动作可以都抽象成对订单的操作,以链路的方式将这些动作串起来。

2、Sentinel的SlotChain

Sentinel是一个流控框架,对进来的请求进行统计、限流、权限控制、降级等处理,它也做成处理链的形式,方便添加新的处理逻辑。在这里,被处理者是资源ResourceWrapper,处理者是Slot,处理者链路是SlotChain,具体的Slot实现类有NodeSelectSlot、FlowSlot等。

详细的实现原理和代码实现分析: Sentinel流控实现原理+代码实现分析-CSDN博客

(二)、抽象工厂模式

适用场景:
需要根据"系列名称"等来获取一系列的对象实例,这些对象实例有一个聚合的业务含义,比如都属于鞋子加工过程中用到的设备。

类图分析:
角色:抽象工厂 工厂 抽象产品 产品

举例:
1、快麦erp,业务流程中需要与不同平台(淘宝、京东)交互,比如从不同平台下载订单,下载部分的代码包含平台接口请求以及转化为我们系统的订单实体的代码。
我们将这些与平台相关的业务逻辑代码提取出来,作为抽象接口,在业务代码中使用的时候以PlatformAccessManager.load(平台名,业务类.class)的形式加载。PlatformAccessManager就是抽象工厂,能够根据平台名返回该平台对应的操作类。
这里将操作类抽象出来的方式有模板模式的味道,只是具体的实现类不是模板的子类,而是类似策略模式里的策略类。

public class TradeDownloadService {public void downLoad(String platform, String tid) {DownloadBusiness downloadBusiness = PlatformAccessManager.load(platform, DownloadBusiness.class);downloadBusiness.download(tid);}
}public interface DownloadBusiness {Trade download(String tid);
}

(三)、外观模式

适用场景:

封装内部的多个服务的功能,给外界提供一个统一的接口。

类图分析:

角色:对外接口 内部实现类

举例:

1、快麦erp,模块一Dubbo接口的形式暴露本模块的对外功能接口,这些接口的实现中包含对本模块的服务功能的整合。

(四)、观察者模式

适用场景:
事件的发布者与订阅者常常属于不同的业务模块、不同的处理线程,如何将这两者、这两个过程解耦,就是观察者模式实现的效果。一个发布者可以对应多个订阅者,一旦发布者发出通知,订阅者收到消息,便可做相应的消息处理。

类图分析:
角色: 主题 观察者 

举例:
1、消息队列
在分布式应用中,为了达到模块之间解耦、数据处理过程异步拆解的目的,常常会以消息的形式来触发过程执行,通知者和被通知者分别对应消息队列中的发布者和订阅者。

比如订单生成成功后,锁定库存需要同步进行,但是订单操作日志记录的工作实时性要求不高,可以通过消息队列的形式通知进行。

(五)、代理模式
适用场景:
要为一些过程增加统一的拦截处理,比如记录日志、权限验证,就可以使用代理模式。通过对实际对象的处理动作进行代理,就可以实现动作拦截、行为控制、增加统一动作的效果。

类图分析:
角色: 被代理接口 被代理类 代理类

举例:
1、拦截器实现权限过滤

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

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

相关文章

HWL-41无辅源静态电流继电器 0.5-9.99A 导轨安装 JOSEF约瑟

HWL-40系列无辅源静态电流继电器 HWL-41HWL-42 HWL-43HWL-61 HWL-62HWL-63 HWL-71HWL-72 HWL-73HWL-81 HWL-82HWL-83 产品概述 1、HWL系列集成电路无辅源电流继电器用于发电机、变压器和输电线的过负荷和短路保护装置中作为启动元件。本继电器为集成电路静态型继电器&a…

Token的详解

Token的详解 文章目录 Token的详解前言:简介:使用token: 前言: 为什么会用到Token,因为cookie和session一些自身的缺点,限制了一些功能的实现,比如: cookie:优点是节省服务器空间,缺点不安全。…

启动Vue-demo时引发的一系列问题—解决办法

目录 1.初始遇到的问题:输入npm run dev 1.治标的解决方法 2.治本的解决方法 第一步:检查是否安装了cnpm 第二步:手动找到cnpm目录 第三步:配置系统环境变量 第四步:查看是否安装成功 1.初始遇到的问题&#xf…

宝塔面板系列——两种方式安装青龙面板

因为最近旧windows服务器到期了,在搬服务器,新服务器尝试用Linux系统。过程中有很多不懂的地方,只能边搬迁边学边弄,顺带记录下来,哪天又要搬迁了,翻翻自己的文章也就一应俱全了。 非科班出身,选…

【计算机网络实践】Cisco Packet Tracer局域网组网(FTP服务器通过交换机连接客户端)

本文为应对计算机网络第一次实验所写的预习报告 一、实验准备 一台装有Cisco Packet Tracer的PC机,一个大学生大脑。 二、了解FTP和Cisco Packet Tracer 具体内容可在百度搜索,在物理机上用FileZilla Server实现ftp可参看我前面的文章。Cisco Packet Tr…

【LabVIEW FPGA入门】FPGA不同传递数据方法比较

数据共享方法的选择应基于应用的需要。根据应用程序的重要特性,所讨论的任何一种方法都可能是合适的。 传输方法FPGA资源损耗?不同时钟源之间传递数据?新数据通知?常见用途变量逻辑片是是否提取最新数据存储器存储器是否否提取最新…

深入理解MySQL中的JOIN算法

码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! 目录 一、引言二、嵌套循环连接(Nested-Loop Join)2.1 工作原理2.2 性能考虑2.3 优化策略 三、块嵌套循环…

Java代码基础算法练习-递归求数-2024.03.22

任务描述: 利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。 任务要求: 代码示例: package march0317_0331;import java.util.Scanner;/*** m240322类,提供了一个反转输入字符串前5个字符的…

软考复习笔记day3(计算机体系结构和指令系统基础)(精简版)

计算机体系结构分类 处理机数量分类: 单处理(一个处理单元)并行处理系统(两个以上处理机互联).分布式处理系统 Flynn分类:(常考) 以指令流和数据流进行区别 指令流由控制部分进…

vue3初步学习

vue3初步学习 vue模版 练习代码如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>实验4</ti…

计算机二级(python)【二】

真题5 1、考生文件夹下存在一个文件PY101.py&#xff0c;请写代码替换横线&#xff0c;不修改其他代码&#xff0c;实现以下功能&#xff1a; 键盘输入正整数n&#xff0c;按要求把n输出到屏幕&#xff0c;格式要求&#xff1a;宽度为15个字符&#xff0c;数字右边对齐&#…

【小米汽车SU7实测】 小米汽车su7到底行不行?小米新能源轿车体验感怎么样?

小米汽车SU7是小米汽车的首款车型&#xff0c;定位“C级高性能生态科技轿车”&#xff0c;也是小米迈入新能源赛道的首次成果落地。 首先&#xff0c;让我们来谈谈它的性能。试驾过程中&#xff0c;小米SU7展现出了惊人的加速能力&#xff0c;0-100km/h加速仅需2.78秒&#xf…

Vue项目使用process.env关键字及Vue.config.js配置解决前端跨域问题

1.process.env 是Node.js 中的一个环境 1.打开命令行查看环境: 2.process.env与Vue CLI 项目 Vue Cli 有以下三种运行模式 development 模式用于 vue-cli-service serve test 模式用于 vue-cli-service test:unit production 模式用于 vue-cli-service build 和 vue-cli-se…

【STL学习】(1)string类

前言 本文将详细讲解STL中string类的常用的接口函数。 一、为什么学习string类&#xff1f; 1、字符串类型的重要性 在现实生活中有很多复杂类型是以字符串来表达的&#xff0c;比如我们在搜索引擎输入的“数据”&#xff0c;一个人的姓名、身份证号等等。 所以字符串类型是很…

ETCD跨城容灾与异地多活网络故障的相关表现分析

ETCD跨城容灾与异地多活网络故障的相关表现分析 1. 网络架构2. 单个网络中断-跟leader区中断2.1. 网络中断2.2. 网络恢复 3. 单个网络中断-跟非leader区中断4. 两个网络中断-leader区中断5. 两个网络中断-非leader区中断6. 两个网络中断-非leader区中断7. 总结8. 参考文档 etcd…

【多线程】有了解过 CAS 和原子操作吗?

SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;学习Java 个性签名&#xff1a;人生乏味啊&#xff0c;我欲令之光怪陆离 本文封面由 凯楠&#x1f4f7; 友情赞助! 目录 前言 悲观锁和乐观锁 什么是 CAS ? 什么是原子操作&#xff1f; CAS 执行流…

git 上传文件夹至远端仓库的方法

上传的远端git可以是gitlab、github、gitee、gitblit或者gitCode等等 以下以GitHub为例说明&#xff1a; 1、登录GitHub网站&#xff08;账户/密码&#xff09; 2、创建一个新的空白项目&#xff08;或者已有的项目&#xff09;hello-world 分支是master &#xff0c;这里默认即…

面经Java开发

联奕一面: 1、这段代码的输出结果是多少?t q z package com.smart.community.test;public class Test {public class B{static {System.out.println("t");}public B(){System.out.println("z");}}public class A extends B{static {System.out.println…

Matlab2024a在Windows系统上的安装配置

目录 前言一、​Matlab在Windows系统上安装总结 前言 Matlab是一种高级技术计算和编程环境&#xff0c;广泛应用于科学、工程和金融等领域。它提供了丰富的工具和函数库&#xff0c;用于数据分析、可视化、模型建立、算法开发和应用部署等任务。注&#xff1a;文末附有下载链接…

Unity vision pro模拟器开发教程-附常见问题解决方案

前言 庄生晓梦迷蝴蝶&#xff0c;望帝春心托杜鹃 废话 去年苹果发布会上&#xff0c;推出了Vision Pro这一款XR产品。并且宣布Unity作为其主要合作伙伴&#xff0c;负责开发XR的开发产品。 这消息一出&#xff0c;当晚Unity的股价直接被熔断。产品发布之后&#xff0c;一直等…