GoF23种设计模式 简介

文章目录

  • 面向对象(OO)设计原则(7)
      • 单一职责原则
      • 开闭原则
      • 里氏代换原则
      • 依赖倒转原则
      • 接口隔离原则
      • 合成复用原则
      • 迪米特法则
  • 创建型模式 (5)
      • 工厂方法模式 (类模式,其余都是对象模式)
      • 抽象工厂模式
      • 建造者模式
      • 原型模式
      • 单例模式
  • 结构型模式 (7)
      • 适配器模式
      • 桥接模式
      • 组合模式
      • 装饰模式
      • 外观模式
      • 享元模式
      • 代理模式
        • 装饰模式(Decorator) 与 代理模式(Proxy) 的根本区别
  • 行为型模式 (11)
      • 解释器模式 (类模式)
      • 模板方法模式(类模式)
      • 职责链模式
      • 命令模式
      • 迭代器模式
      • 中介者模式
      • 备忘录模式
      • 观察者模式
      • 状态模式
      • 策略模式
      • 访问者模式

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

面向对象(OO)设计原则(7)

在这里插入图片描述
可维护性(Maintainability) ,可复用性(Reusability)
在这里插入图片描述

单一职责原则

一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中

在这里插入图片描述
在这里插入图片描述

开闭原则

软件实体应当对扩展开放,对修改关闭

在这里插入图片描述
在这里插入图片描述

里氏代换原则

所有引用基类的地方必须能透明地使用其子类的对象

在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常:

在这里插入图片描述

继承重写的类应可使用:

在这里插入图片描述
cipher 密码

依赖倒转原则

高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象

要针对接口编程

在这里插入图片描述
增加一个新的类型时需要修改源代码了,违背了开闭原则。

在这里插入图片描述

MainClass 依赖 抽象。

接口隔离原则

客户端不应该依赖那些它不需要的接口

在这里插入图片描述

在这里插入图片描述
这里三个Service可能差异特别大,比如openGL的片元着色器fshader,可能有的模型网格就没有纹理,有的不需要影子,这些网格就可以单独用一个着色器。🤓

合成复用原则

优先使用对象组合,而不是继承来达到复用的目的

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
自己留Operator

迪米特法则

应该尽量减少对象之间的交互

每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位

在这里插入图片描述
在这里插入图片描述

创建型模式 (5)

工厂方法模式 (类模式,其余都是对象模式)

有生产方法接口,具体内容由继承后重写决定。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

当涉及到多个工厂和多个商品时,工厂方法模式通常会发展为抽象工厂模式。

抽象工厂模式

【不同厂子与相同产品】调用同样的类的方法<多态>
在这里插入图片描述

在这里插入图片描述

建造者模式

【车与造车】

产品本身与产品的创建过程解耦

在这里插入图片描述
在这里插入图片描述

原型模式

【拷贝用的函数】

复制 (深/浅)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

单例模式

确保一个类只有一个实例

在这里插入图片描述


结构型模式 (7)

结构型模式(Structural Pattern)关注如何将现有类或对象组织在一起形成更加强大的结构。

类结构型模式 关心类的组合 【继承关系和实现关系】

对象结构型模式 关心类与对象的组合

适配器模式

【接口转换】

(包装器(Wrapper)模式)

在这里插入图片描述
在这里插入图片描述

桥接模式

【抽象与实现解耦】

在这里插入图片描述
形状与颜色两个维度。

在这里插入图片描述
在这里插入图片描述

组合模式

【树形结构】

在这里插入图片描述

在这里插入图片描述
(多叶子)

装饰模式

【动态增加职责】(比子类灵活)
在这里插入图片描述
在这里插入图片描述
拿到成员,可以调用他的所有方法;若有get方法,就能获取成员。

外观模式

【一组接口放一起调用】

<迪米特法则> 引入一个新的外观角色来降低原有系统的复杂

在这里插入图片描述

在这里插入图片描述
facade 外观

享元模式

【共享技术】
在这里插入图片描述
在这里插入图片描述

HashMap可作享元池,存在直接取,不存在再new.

代理模式

【由代理对象来控制对原对象的访问】

在这里插入图片描述

在这里插入图片描述
extends 扩展

同装饰模式一样,也是加一层。

不过装饰模式想增强功能,而这里是想加条件,而不是改变目标对象的行为。

装饰模式(Decorator) 与 代理模式(Proxy) 的根本区别

装饰模式的主要目的是增强或扩展对象的功能,动态地为对象增加额外的功能或行为。
代理模式的主要目的是控制对目标对象的访问,通常用于延迟加载、安全控制等,而不是改变目标对象的行为。


行为型模式 (11)

行为型模式(Behavioral Pattern) 关注系统中对象之间的交互。

类行为型模式 通过多态等方式来分配父类与子类的职责

对象行为型模式 通过对象关联等方式来分配两个或多个类的职责

解释器模式 (类模式)

解释器用定义的表示解释句子。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
node 节点
在这里插入图片描述

模板方法模式(类模式)

基于继承的代码复用技术
在这里插入图片描述
在这里插入图片描述
抽象方法(Abstract Method)
具体方法(Concrete Method)
钩子方法(Hook Method) <插入点>挂接自定义代码
在这里插入图片描述

职责链模式

接收对象连接成一条链,沿着传递,直到有一个对象能够处理它为止。

在这里插入图片描述
在这里插入图片描述
successor 继承人。类成员维持了对下家的引用

命令模式

请求封装为对象
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

迭代器模式

又名游标(Cursor)模式

提供一种方法顺序访问一个聚合对象中的各个元素,且不用暴露该对象的内部表示。

在这里插入图片描述
在这里插入图片描述
由迭代器来提供遍历聚合对象内部数据的行为,简化聚合对象的设计,更符合单一职责原则

在这里插入图片描述

中介者模式

封装多对多交互。可以使对象之间的关系数量急剧减少。

QQ群
在这里插入图片描述
用户只需要将信息或文件发送到群中或上传为群共享文件即可,群的作用就是将发送者所发送的信息和文件转发给每一个接收者,将极大地减少系统中用户之间的两两通信。

在这里插入图片描述
colleague 同事

备忘录模式

快照。

在这里插入图片描述
在这里插入图片描述
originator 创始人
memento 纪念品
caretaker 管理员

观察者模式

一对多,状态改变通知。

在这里插入图片描述

在这里插入图片描述

假设猫是老鼠和狗的观察目标,老鼠和狗是观察者,猫叫老鼠跑,狗也跟着叫,使用观察者模式描述该过程:
在这里插入图片描述

状态模式

状态改变时改变行为。
在这里插入图片描述
在这里插入图片描述

策略模式

算法封装,可替换
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

访问者模式

在不改变各元素的类的前提下定义新操作。

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【数电尾灯设计】2022-8-16

缘由数电尾灯设计问题&#xff0c;求解答--CSDN问答 从题目可以列出 000 100 010 111-----------4进制 000 100 010 110 001 101 011 111-----------8进制 由列出可知用16进制芯片的3个引脚可以获得8进制推导出4进制从而可用逻辑处理为4进制实现尾灯功能。之上第一步实现了尾灯…

在线机考|2024华为实习秋招春招编程题(最新)——第3题_个性化歌单推荐系统_300分(十一)

题目内容 假设你是音乐服务的开发者,为了提高用户体验需要解决推荐歌单的同质化问题,保证推荐给用户的所有歌单不包含相同歌曲的。给定一个包含N个歌单和M条歌单重复记录,每个歌单用一个从1到N的整数编号,歌单重复记录包含两个歌单的ID,表示两个歌单有相同的歌曲。 你的任…

Ant Design Pro写项目的总结经验(react)

配置代理&#xff08;proxy&#xff09; 在config文件夹下面的config.ts里面配置修改 修改前&#xff1a;修改后&#xff1a; 修改账号框以及登录接口以及登录返回的code 由于它的账号框是username,但是我们接口请求要填写的是account&#xff0c;因此可以全局搜索进行替换…

安卓14无法安装应用解决历程

客户手机基本情况&#xff1a; 安卓14&#xff0c;对应的 targetSdkVersion 34 前天遇到了安卓14适配问题&#xff0c;客户发来的截图是这样的 描述&#xff1a;无法安装我们公司的B应用。 型号&#xff1a;三星google美版 解决步骤&#xff1a; 1、寻找其他安卓14手机测试…

51单片机(二)中断系统与外部中断实验

中断即单片机因为某些原因E暂定现在的工作P0&#xff0c;转去做其他的工作P1&#xff0c;完了之后继续之前的事P0&#xff0c;其他工作P1就是中断程序&#xff0c;原因E就是中断事件&#xff0c;原因由外部发生&#xff0c;程序不能预测到的是硬中断&#xff0c;可以由程度触发…

66.基于SpringBoot + Vue实现的前后端分离-律师事务所案件管理系统(项目 + 论文)

项目介绍 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装律师事务所案件管理系统软件来发挥其高效地信息处理的作用…

大数据组件(三)快速入门实时计算平台Dinky

大数据组件(三)快速入门实时计算平台Dinky Dinky 是一个开箱即用的一站式实时计算平台&#xff08;同样&#xff0c;还有StreamPark&#xff09;&#xff0c;以 Apache Flink 为基础&#xff0c;连接数据湖仓等众多框架&#xff0c;致力于流批一体和湖仓一体的建设与实践。 Di…

实际开发中,常见pdf|word|excel等文件的预览和下载

实际开发中,常见pdf|word|excel等文件的预览和下载 背景相关类型数据之间的转换1、File转Blob2、File转ArrayBuffer3、Blob转ArrayBuffer4、Blob转File5、ArrayBuffer转Blob6、ArrayBuffer转File 根据Blob/File类型生成可预览的Base64地址基于Blob类型的各种文件的下载各种类型…

《Vue3实战教程》19:Vue3组件 v-model

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 组件 v-model​ 基本用法​ v-model 可以在组件上使用以实现双向绑定。 从 Vue 3.4 开始&#xff0c;推荐的实现方式是使用 defineModel() 宏&#xff1a; vue <!-- Child.vue --> <script setup> co…

源代码编译安装X11及相关库、vim,配置vim(1)

一、目录结构 如下。 所有X11及相关库装到mybuild&#xff0c;源代码下载到src下&#xff0c;解压&#xff0c;进入&#xff0c;编译安装。编译时指定--prefix到相同的目录&#xff0c;即上图中mybuild。 ./configure --prefixpwd/../../mybuild [CFLAGS"-I/path/to/X11…

图漾相机基础操作

1.客户端概述 1.1 简介 PercipioViewer是图漾基于Percipio Camport SDK开发的一款看图软件&#xff0c;可实时预览相机输出的深度图、彩色图、IR红外图和点云图,并保存对应数据&#xff0c;还支持查看设备基础信息&#xff0c;在线修改gain、曝光等各种调节相机成像的参数功能…

vulnhub靶场-potato(至获取shell)

arp-scan -l 扫描IP 使用御剑端口扫描扫描端口&#xff0c;扫到了80和7120两个端口&#xff0c;其中7120为ssh端口 使用dirb http://192.168.171.134 扫描目录 发现info.php 访问为phpinfo界面 访问192.168.171.134为一个大土豆&#xff0c;没什么用 所以我们从ssh入手 盲…

谈一谈对事件循环的理解

事件循环⼜叫做消息循环&#xff0c;是浏览器渲染主线程的⼯作⽅式。特别是在JavaScript和Node.js等异步编程环境中&#xff0c;也是核心概念之一。它的主要作用是管理异步操作&#xff0c;确保代码的执行顺序和效率。 并且这个话题很有可能是一个面试题。我先把参考答案放下面…

kafka使用以及基于zookeeper集群搭建集群环境

一、环境介绍 zookeeper下载地址&#xff1a;https://zookeeper.apache.org/releases.html kafka下载地址&#xff1a;https://kafka.apache.org/downloads 192.168.142.129 apache-zookeeper-3.8.4-bin.tar.gz kafka_2.13-3.6.0.tgz 192.168.142.130 apache-zookee…

解决 IntelliJ IDEA 中 Tomcat 日志乱码问题的详细指南

目录 前言1. 分析问题原因2. 解决方案 2.1 修改 IntelliJ IDEA 的 JVM 选项2.2 配置 Tomcat 实例的 VM 选项 2.2.1 设置 Tomcat 的 VM 选项2.2.2 添加环境变量 3. 进一步优化 3.1 修改 Tomcat 的 logging.properties3.2 修改操作系统默认编码 3.2.1 Windows 系统3.2.2 Linux …

067B-基于R语言平台Biomod2模型的物种分布建模与数据可视化-高阶课程【2025】

课程培训包含&#xff1a;发票全套软件脚本学习数据视频文件导师答疑 本教程旨在通过系统的培训学习&#xff0c;学员可以掌握Biomod2模型最新版本的使用方法&#xff0c;最新版包含12个模型&#xff08;ANN, CTA, FDA, GAM, GBM, GLM, MARS, MAXENT, MAXNET, RF, SRE, XGBOOST…

【论文复现】改进麻雀搜索算法优化冷水机组的最优负载调配问题

目录 1.摘要2.麻雀搜索算法SSA原理3.改进策略4.结果展示5.参考文献6.代码获取 1.摘要 为了应对暖通空调&#xff08;HVAC&#xff09;系统由于不当负荷分配导致的高能源消耗问题&#xff0c;本文提出了一种改进麻雀搜索算法&#xff08;ISSA&#xff09;。ISSA算法旨在在满足负…

Java实现下载excel模板,并实现自定义下拉框

GetMapping("excel/download")ApiOperation(value "模板下载")public void getUserRecordTemplate(HttpServletResponse response, HttpServletRequest request) throws IOException {OutputStream outputStream response.getOutputStream();InputStream…

UCAS-算法设计与分析(专硕)-复习参考

算法设计与分析&#xff08;专硕&#xff09; 希望对后来者选课 or 复习提供参考 考试时间&#xff1a;2025年1月6日 18:10~21:00 15 个选择、10个填空、10个计算大题 三个小时&#xff0c;手没有停过&#xff0c;不停得在算&#xff0c;好在没有留空&#xff0c;但已知有些内…

什么样的人适合从事FPGA开发的工作?

FPGA开发不仅要求扎实的技术基础&#xff0c;还非常看重团队合作、自信、沟通技巧以及细致入微的工作态度。从业者需具备面对复杂项目的自信&#xff0c;优秀的沟通能力以确保团队协作顺畅&#xff0c;严谨细心以应对精密的硬件设计&#xff0c;以及强烈的责任心来驱动每一个开…