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

设计模式的作用:

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.hqwc.cn/news/562422.html

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

相关文章

mysql无法看到3306端口监听

参考:https://blog.csdn.net/shumeigang/article/details/103902459 mysql> show global variables like ‘port’; 是0 原因是我的my.cnf有话: skip-network 或 注释掉,然后重新启动下数据库,运行netstat -an|grep 3306 就可以看到了

如何进行设备的非对称性能测试

非对称性能测试介绍 RFC2544是RFC组织提出的用于评测网络互联设备(防火墙、IDS、Switch等)的国际标准。主要是对RFC1242中定义的性能评测参数的具体测试方法、结果的提交形式作了较详细的规定。标准中定义了4个重要的参数:吞吐量&#xff08…

思通舆情 是一款开源免费的舆情系统 介绍

思通舆情 是一款开源免费的舆情系统。 支持本地化部署,支持在线体验。 支持对海量舆情数据分析和挖掘。 无论你是使用者还是共同完善的开发者,欢迎 pull request 或者 留言对我们提出建议。 您的支持和参与就是我们坚持开源的动力!请 sta…

【Linux】程序地址空间

程序地址空间 初识程序地址空间进程地址空间一些补充虚拟地址转物理地址的工作谁来做?进程地址空间存在的意义回看new/malloc 进程中的写时拷贝一点延申 初识程序地址空间 运行结果如下:   我们发现父进程和子进程打印出来的值和地址都是一样的&#…

花生壳 | ubuntu安装和卸载花生壳

一、到花生壳官网下载linux版本的花生壳 一般下载到Downlaods文件夹 进入文件夹 dpkg -i phddns_5_1_amd64.deb #安装花生壳 dpkg -r phddns #卸载花生壳 登录花生壳管理网站 http://b.oray.com 在Ubuntu中输入命令查看sn码,默认密码为admin phddns status …

01.绝对路径和相对路径(Linux基本概念)

基础认知: 电脑的目录结构是一颗多叉树。不管是Linux还是windows,目录结构都是一样的。所以我们在查找某个目录或者文件的时候,本质就是在多叉树结点的查找。多叉树示例图如下: ​​​​​​​ ​​​​​​​ ​​…

Unity发布webgl设置占满浏览器运行

Unity发布webgl设置占满浏览器运行 Unity发布webgl的时候index.html的模板文件 模板文件路径,根据自己的需求修改。 C:\Program Files\Unity\Hub\Editor\2021.1.18f1c1\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\WebGLTemplates\Default再桌面新建一个t…

飞桨AI应用@riscv OpenKylin

在riscv编译安装飞桨PaddlePaddle参见: 算能RISC-V通用云编译飞桨paddlepaddleopenKylin留档_在riscv下进行paddlelite源码编译-CSDN博客 安装好飞桨,就可以用飞桨进行推理了。刚开始计划用ONNX推理,但是在算能云没有装上,所以最…

【Linux】从零认识进程 — 中下篇

送给大家一句话: 人一切的痛苦,本质上都是对自己无能的愤怒。而自律,恰恰是解决人生痛苦的根本途径。—— 王小波 从零认识进程 1 进程优先级1.1 什么是优先级1.2 为什么要有优先级1.3 Linux优先级的特点 && 查看方式1.4 其他概念 2…

SpringBoot 邮件服务集成配置全面解析

前言 本文以网易邮箱(及 163 邮箱)为例,展示如何为 SpringBoot 项目集成邮件服务,其他邮箱配置类似,可以自行查看 Spring Email 指南 或是其他官方文档 授权码 首先我们需要获取授权码,用于后续配置&…

[Linux]知识整理(持续更新)

前言 Linux的目录结构 Linux的目录结构是一个树型结构 Windows 系统可以拥有多个盘符, 如 C盘、D盘、E盘 Linux没有盘符这个概念, 只有一个根目录 /, 所有文件都在它下面 Linux路径的描述方式 第一章 基本命令 命令格式 例:ls –la /etc 说明: 1…

Centos上安装Harbor并使用

harbor的安装与使用 Harbor介绍安装前的准备工作为Harbor自签发证书安装Harbor安装docker开启包转发功能和修改内核参数安装harbor扩展 Harbor 图像化界面使用说明测试使用harbor私有镜像仓库从harbor仓库下载镜像 Harbor介绍 容器应用的开发和运行离不开可靠的 镜像管理&…