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

设计模式的作用:

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.rhkb.cn/news/283795.html

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

相关文章

【QT入门】 Qt实现自定义信号

往期回顾: 【QT入门】图片查看软件(优化)-CSDN博客 【QT入门】 lambda表达式(函数)详解-CSDN博客 【QT入门】 Qt槽函数五种常用写法介绍-CSDN博客 【QT入门】 Qt实现自定义信号 一、为什么需要自定义信号 比如说现在一个小需求,我们想要实现跨ui通信&a…

Git 使用笔记

基本操作: 初始化 (git init) 使用背景和作用: 在本地建立一个文件夹后,基于这个文件夹进行git 操作,赋予git操作本文件夹的权限 。查看当前文件夹状态(git status) 每次打开文件夹…

环信新版单群聊UIKit集成指南——Android篇

前言 环信新版UIKit已重磅发布!目前包含单群聊UIKit、聊天室ChatroomUIKit,本文详细讲解Android端单群聊UIKit的集成教程。 环信单群聊 UIKit 是基于环信即时通讯云 IM SDK 开发的一款即时通讯 UI 组件库,提供各种组件实现会话列表、聊天界…

机器学习:智能时代的核心引擎

目录 一、什么是机器学习 二、监督学习 三、无监督学习 四、半监督学习 五、强化学习 一、什么是机器学习 机器学习是人工智能的一个分支,它主要基于计算机科学,旨在使计算机系统能够自动地从经验和数据中进行学习并改进,而无需进行明确…

鸿蒙Harmony应用开发—ArkTS(stateStyles:多态样式)

Styles和Extend仅仅应用于静态页面的样式复用,stateStyles可以依据组件的内部状态的不同,快速设置不同样式。这就是我们本章要介绍的内容stateStyles(又称为:多态样式)。 概述 stateStyles是属性方法,可以…

CodeSys创建自定义的html5控件

文章目录 背景创建html5control.xml文件控件界面以及逻辑的实现使用的资源安装自定义的html5控件库 背景 查看官方的资料:https://content.helpme-codesys.com/en/CODESYS%20Visualization/_visu_html5_dev.html 官方的例子:https://forge.codesys.com/…

【机器学习入门 】逻辑斯蒂回归和分类

系列文章目录 第1章 专家系统 第2章 决策树 第3章 神经元和感知机 识别手写数字——感知机 第4章 线性回归 文章目录 系列文章目录前言一、分类问题的数学形式二、最大似然估计三、交叉熵损失函数四、多类别分类多类别逻辑斯蒂回归归一化指数函数交叉熵误差和均方误差的比较 五…

MySQL、Oracle的时间类型字段自动更新:insert插入、update更新时,自动更新时间戳。设置自增主键id,oracle创建自增id序列和触发器

1. MySQL 支持设置自增id的字段类型:int、bigint、double等数值类型,一般用int、bigint支持设置自动更新时间的字段类型:datetime、timestamp下面sql中的now()函数可以用current_timestamp()替代 1.1. 不指定秒精度 drop table if exists …

【蓝桥杯-单片机】基于定时器的倒计时程序设计

基于定时器的倒计时程序 题目如下所示: 实现过程中遇到的一些问题 01 如何改变Seg_Buf数组的值数码管总是一致地显示0 1 2 3 4 5 首先这个问题不是在main.c中关于数码管显示部分的逻辑错误,就是发生在数码管的底层错误。 检查了逻辑部分&#xff…

【C++庖丁解牛】二叉搜索树(Binary Search Tree,BST)

🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 1. 二叉搜索树概念2. 二叉…

python框架的一加剧场管理系统的设计与实现flask-django-nodejs-php

本文讲述了一加剧场管理系统。结合电子管理系统的特点,分析了一加剧场管理系统的背景,给出了一加剧场管理系统实现的设计方案。 本论文主要完成不同用户的权限划分,不同用户具有不同权限的操作功能,在用户模块,主要有用…

letcode::根据二叉树创建字符串

根据二叉树创建字符串 题目描述: 给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。 空节点使用一对空括号对 “()” 表示,转化后需要省略所有不影…

一文读懂SDRAM内存模组与基本概念

本文可以了解什么? DDR-DDR4内存模块的差异以及对比;逻辑BANK的概念与定义;芯片的位宽的解释。 下图是DDR3的PHY IP Core的定义规范。 DDR-DDR4的物理结构差异 首先,我们来对比一下DDR, DDR2, DDR3 SDRAM, and DDR4 SDRAM物理…

cyclictest 交叉编译报错---rt_numa.h:18:10: fatal error: numa.h: 没有那个文件或目录

cyclictest 主要是用于测试系统延时,进而判断系统的实时性 使用版本 rt-tests-2.6.tar.gz numactl v2.0.16 问题 编译时,需要先编译 numactl ,不然会有以下报错: arm-linux-gnueabihf-gcc -D VERSION2.6 -c src/cyclictest/c…

FPGA——DDR3的IP核

FPGA——DDR3的ip核 IP核配置基于MIG核代码基于AXI接口的DDR3 IP核配置 1 2 3 4 5 6 基于MIG核代码 控制MIG核的信号进行读写 module MIG_APP_Drive(input i_ui_clk ,input i_ui_rst ,input init_calib_…

数字孪生底层技术框架

数字孪生是一种将现实世界中的物理实体、过程或系统数字化并映射到计算机模型中的方法。它在数学建模与仿真方面具有重要作用,为了实现数字孪生,以下是一些底层技术框架和方法,希望对大家有所帮助。北京木奇移动技术有限公司,专业…

[OpenCV学习笔记]获取鼠标处图像的坐标和像素值

目录 1、介绍2、效果展示3、代码实现4、源码展示 1、介绍 实现获取鼠标点击处的图像的坐标和像素值&#xff0c;灰度图显示其灰度值&#xff0c;RGB图显示rgb的值。 OpenCV获取灰度值及彩色像素值的方法&#xff1a; //灰度图像&#xff1a; image.at<uchar>(j, i) //j…

牛客NC111 最大数【中等 贪心、排序 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/fc897457408f4bbe9d3f87588f497729 思路 贪心解法对于 numsnums 中的任意两个值 aa 和 bb&#xff0c;我们无法直接从常规角度上确定其大小/先后关系。但我们可以根据「结果」来决定 aa 和 bb 的排序关系&#…

链表oj测试题(上)

链表的申明&#xff1a; struct ListNode {int val;struct ListNode* next; }; 1.题1 删除指定元素 例如&#xff1a;链表1 2 6 3 4 5 6&#xff0c;然后选择删除元素6&#xff0c;返回的链表为1 2 3 4 5 。 代码演示&#xff1a; typedef struct ListNode ListNode;List…

【C++航海王:追寻罗杰的编程之路】stack

目录 1 -> stack的介绍和使用 1.1 -> stack的介绍 1.2 -> stack的使用 1.3 -> stack的模拟实现 1 -> stack的介绍和使用 1.1 -> stack的介绍 stack的文档介绍 1. stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c…