【系统架构设计】设计模式

news2024/9/20 19:56:57

【系统架构设计】设计模式

  • 设计模式概述
    • GoF设计模式
      • Factory Method
      • Abstract Factory (*)
      • Builder
      • Prototype(原型)
      • Singleton(*)
      • Adapter
      • Bridge
      • Composite(组合)
      • Decorator(装饰)(*)
      • Facade(外观)(*)
      • Flyweight(享元)
      • Proxy
      • Interpreter(解释器)
      • Template Method
      • Chain of Responsibility
      • Command
      • Iterator
      • Mediator(中介模式)(*)
      • Memento(备忘录模式)
      • Observer(观察者)(*)
      • State
      • Strategy
      • Visitor
    • GoF模式分类
    • 其他设计模式

设计模式概述

  • 设计模式解决是一类问题
  • 设计模式是一种通用的解决方案,而不是具体的,也不是唯一的
  • 设计模式的使用要适度,过度使用会让架构变得混乱而难以维护
  • 描述一个设计模式时,至少需要包含四个方面:模式名称、问题、解决方案、效果

ps: 架构的话就是整体系统的布局,而设计模式就是里面具体问题的一种解决思想。

GoF设计模式

Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人组在书《设计模式:可复用面向对象软件的基础》中提出的设计模式,统称为GoF设计模型,一共提出了23个模式。

Factory Method

提供了一种延迟创建类的方法,使用这个方法可以在运行期由子类决定创建哪一个类的实例

Abstract Factory (*)

又称为抽象工厂模式,该模式主要为解决复杂系统中对象创建的问题。抽象工厂模式提供了一个一致的对象创建接口来创建一系列具有相似基类或相似接口的对象。本质上就是咱们平时用的创建多个抽象类,然后根据不同对象情况进行实现

Builder

与 Abstract Factory 模式非常类似,但 Builder 模式是逐步地构造出一个复杂对象,并在最后返回对象的实例。Builder 模式可以把复杂对象的创建与表示分离,使得同样的创建过程可以创建不同的表示。

Prototype(原型)

可以根据原型实例制定创建的对象的种类,并通过深复制这个原型来创建新的对象。Prototype 模式有着同 Abstract Factory 模式和 Builder 模式相同的效果,不过当需要实例化的类是在运行期才被指定的,而且要避免创建一个与产品
曾是平行的工厂类层次时,可以使用 Prototype 模式。使用 Prototype 模式可以在运行时增加或减少原型,比 Abstract Factory 和 Builder 模式更加灵活

Singleton(*)

也是一种很有代表性的模式。使用 Singleton 模式可以保证一个类仅有一个实例,从而可以提供一个单一的全局访问点。其实就是单实例,只有一个实例对象,不能创建多个,C++ 中可以用Template ,比如打印操作,那肯定就是单实例,不能多实例操作

Adapter

可以解决系统间接口不相容的问题。通过 Adapter 可以把类的接口转化为客户程序所希望的接口,从而提高复用性。

Bridge

把类的抽象部分同实现部分相分离,这样类的抽象和实现都可以独立地变化。

Composite(组合)

提供了一种以树形结构组合对象的方法,使用Composite 可以使单个对象和组合后的对象具有一致性以提高软件的复用性。

Decorator(装饰)(*)

可以动态地为对象的某一个方法增加更多的功能。在很多时候,使用 Decorator 模式可以不必继承出新的子类从而维护简洁的类继承结构。** 本质上就是多继承,新增加一个与接口相同的装饰类,然后对这个装饰类去进行不断继承与具体实现**。

Facade(外观)(*)

为一组类提供了一致的访问接口。使用 Facade 可以封装内部具有不同接口的类,使其对外提供统一的访问方式。Facade 模式在 J2EE 系统开发中发展为 Session Facade 模式。** 本质上就是封装具体实现,然后对外开放一个的公共接口让其余系统访问,这样避免调用方去理解具体实现,只需要调用同一个接口,然后就可以调用不同的业务方法**。

Flyweight(享元)

可以共享大量的细粒度对象,从而节省创建对象所需要分配的空间,不过在时间上的开销会变大。

Proxy

为对象提供了一种访问代理,通过对象 Proxy 可以控制客户程序的访问。最近博文中碰到的hook 就用到了这个代理模式

Interpreter(解释器)

定义了一个解释器,来解释遵循给定语言和文法的句子。

Template Method

定义一个操作的模板,其中的一些步骤会在子类中实现,以适应不同的情况。

Chain of Responsibility

把可以响应请求的对象组织成一条链,并在这条对象链上传递请求,从而保证多个对象都有机会处理请求而且可以避免请求方和相应方的耦合。最近方案设计中就用到了这种,一请求可以有多对象回复,然后选其中一个回复

Command

将请求封装为对象,从而增强请求的能力,如参数化、排队、记录日志等。

Iterator

提供了顺序访问一个对象集合中的各元素的方法,使用 Iterator 可以避免暴露集合中对象的耦合关系。

Mediator(中介模式)(*)

可以减少系统中对象间的耦合性。Mediator 模式使用中介对象封装其他的对象,从而使这些被封装的对象间的关系就成了松散耦合。** 有点类似消息机制,但又与消息机制有很大区别,不需要负责消息的排队、优先级等处理**。

Memento(备忘录模式)

提供了一种捕获对象状态的方法,且不会破坏对象的封装。并且可以在对象外部保存对象的状态,并在需要的时候恢复对象状态。

Observer(观察者)(*)

提供了将对象的状态广播到一组观察者的方式,从而可以让每个观察者随时可以得到对象更新的通知。** 像之前用的MQTT 就是,订阅发布的体现**。

State

允许一个对象在其内部状态改变的时候改变它的行为。

Strategy

可以让对象中算法的变化独立于客户。

Visitor

表示对某对象结构中各元素的操作,使用 Visitor 模式可以在不改变各元素类的前提下定义作用于这些元素的新操作。

GoF模式分类

根据设计模式要解决的问题将设计模式分为三类:创建型、结构型、行为型

在这里插入图片描述

其他设计模式

在GoF后,人们继续对设计模式进行挖掘,在J2EE应用领域,人们也对J2EE框架开发的应用程序总结了一些设计模型。这边主要介绍 Intercepting Filter 模式(筛选器模式),这种就是咱们平时在Servlet通信前加的过滤器Filter,里面可以预处理,如验证客户身份、验证请求来源等,很常用。

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

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

相关文章

恢复指定人微信聊天记录,看这里,4种方法帮您找回记录

微信在今天成为了我们日常生活中不可或缺的一部分,它承载着我们的社交、工作乃至生活的点点滴滴。然而,有时出于各种原因,我们可能会选择注销微信账号,但随后又可能因种种原因希望恢复其微信进行使用。那么,微信注销了…

CSS溢出——WEB开发系列20

在网页设计中,“溢出”是一个常见且重要的概念。它涉及到如何处理那些超出预定范围的内容,以确保网页的布局和视觉效果达到预期。 一、什么是溢出? 在 CSS 中,“溢出”(overflow)指的是内容超出其包含块的…

构建高效NLP管道:PydanticOutputParser与Langchain的结合

PydanticOutputParser 是一个用于解析语言模型输出的实用工具,它允许用户指定一个 Pydantic 模型,并查询语言模型以生成符合该模型的 JSON 输出。这个工具特别有用,因为它可以帮助开发者确保从语言模型获得的结构化数据符合预期的格式&#x…

全面解析:四大LLM模型——预训练与后训练的新范式

导读 最初,大语言模型LLM的训练过程只关注于预训练,但如今已经扩展到包含预训练和后训练两个阶段。后训练通常包括监督指令微调和对齐,这一方法在ChatGPT发布后广泛流行! 翻译自:https://magazine.sebastianraschka.com/p/new-l…

NAT网关产品手册

产品用途 SG-NAT-410 网关支持 IP 地址跨网段和通讯端口的转换,为不方便修改参数的以太网通讯设备的信息化联网提供便捷的解决方案。网关有 1 个两口以太网交换机接口(LAN 口 ) 和 1 个单口以太网通讯接口 (WAN 口 ) 。不对原系统做任何硬件和软件修改&…

WAF一般是怎么防御SQL注入的

目录 参数化查询在防止SQL注入中起到什么作用? 为什么要限制数据库用户权限来预防SQL注入? WAF是如何检测SQL注入特征的? WAF防范SQL注入的主要策略包括: 参数化查询和预编译语句:使用参数化查询或预编译语句可以确…

虚拟试穿技术分享

虚拟试穿技术,通过计算机视觉和人工智能,允许用户在数字界面上试穿服装,无需实际穿戴。这项技术广泛应用于电子商务和时尚工业,使得消费者可以在购买前预览衣物在自己身上的样子。 基于扩散的方法:这种方法使用基于图像…

微波网络分析仪VNA原理详解:电磁波测量基础-测试狗科研测试

微波网络分析仪VNA原理详解:电磁波测量基础 微波网络分析仪(Vector Network Analyzer,简称VNA)是一种用于测试和测量微波频段元件和网络特性的电子测试设备。 一、电磁波 电磁波是由电场和磁场相互垂直并相互依赖振荡传播的波动现…

餐饮商标怎么注册自己的品牌!

餐饮行业是创业者选的比较多的行业,也有许多人从小做起,成为当地知名品牌,那企业或个体户如何注册餐饮行业的商标。 在餐饮行业首先是申请注册类别43类餐饮住宿,这个是餐饮的核心类别,开店、饭店都在这个类别&#xf…

学习之adb命令

adb命令作用: 用来操作手机系统的 类似于window的cmd,linux的bash 如果添加环境变量的adb不能识别设备通常是因为存在两个不同的版本 如下: adb devices 如果没有发现,可以尝试手动连接设备 需要先执行 adb kill-server adb start-server …

前端模块自动导入的插件

前言 开发中通常会有很多导入语句&#xff0c;如何确保一些通用的api和hook无需每次手动导入即可使用。 <script setup lang"ts"> import { ref, reactive } from "vue" import { useRoute, useRouter } from "vue-router" import { log…

【Spring】Cookie和Session

系列文章目录 第一章 初识Spring MVC 文章目录 系列文章目录前言一、Cookie和Session二、Cookie操作获取Cookie指定Cookie 三、Session操作设置Session数据获取Session数据 四、获取Header总结 前言 HTTP是"无状态"的协议&#xff0c;我们可以理解为它没有记忆力。…

UnrealEngine学习(02):虚幻引擎编辑器界面详解

学习一款软件&#xff0c;我个人建议是先学习怎么用&#xff0c;然后是学习怎么用的好&#xff0c;再研究源码。 上一篇文章详细描述了我们该如何安装虚幻5引擎&#xff1a; UnrealEngine学习(01)&#xff1a;安装虚幻引擎https://blog.csdn.net/zuodingquan666/article/deta…

Kubernetes存储Volume

数据是一个企业的发展核心,他涉及到数据存储和数据交换的内容。在生产环境中尤为重要的一部分&#xff0c;在 Kubernetes 中另一个重要的概念就是数据持久化 Volume。 一、Volume的概念 对于大多数的项目而言&#xff0c;数据文件的存储是非常常见的需求&#xff0c;比如存储用…

SEO优化租用站群服务器需要考虑哪些?

在SEO(搜索引擎优化)的背景下&#xff0c;站群服务器是一种运行多个网站的器&#xff0c;每个网站共享同一个IP地址&#xff0c;但也可拥有独立IP。下面将详细探讨SEO使用站群服务器租用需要考虑的各种因素&#xff0c;rak小编为您整理发布。 1. 网站内容的原创性与相关性 内容…

淘客系统源码的架构分析

淘客系统的架构分析可以从多个层面进行探讨&#xff0c;包括业务流程、技术选型、系统模块、安全性、可扩展性等方面。 业务流程&#xff1a;淘客返利系统的主要业务流程包括用户注册、商品推广、订单跟踪、返利结算等。用户注册成功后&#xff0c;将获得推广链接&#xff0c;…

html+css+js网页设计 电商 珠宝珠宝行业的专业领域应用先状、前沿及发展展望13个页面

htmlcssjs网页设计 电商 珠宝珠宝行业的专业领域应用先状、前沿及发展展望13个页面 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编…

Python新手必看!这个模块让Python的重试更加便捷灵活!

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Python重试 📒📝 安装📝 使用📝 进阶使用⚓️ 相关链接 ⚓️📖 介绍 📖 在Python编程中,网络请求、数据库操作或任何可能因外部因素而失败的场景中,错误重试显得尤为重要。它能有效减少因暂时性问题导致的程序崩溃…

【Qt CMake】Qt5Widgets.dll:-1: error: LNK1107: 文件无效或损坏: 无法在 0x308 处读取

项目场景&#xff1a; CMake 编译QT 工程 编译报错 E:\tool\Qt5.15.2\5.15.2\msvc2019_64\bin\Qt5Widgets.dll&#x1f44e; error: LNK1107: 文件无效或损坏: 无法在 0x308 处读取 问题描述 Cmkae 报错&#xff1a; E:\tool\Qt5.15.2\5.15.2\msvc2019_64\bin\Qt5Widgets.dll…

大模型入门到精通——使用Embedding API及搭建本地知识库(二)

搭建并使用向量数据库 前序基础知识参考链接介绍&#xff1a;大模型入门到精通——使用Embedding API及搭建本地知识库(一) 搭建并使用向量数据库&#xff0c;因此读取数据后我们省去数据处理的环节直入主题 基于 LangChain 实现 README.md 相关文档的向数据库搭建&#xff…