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 管理员

观察者模式

一对多,状态改变通知。

在这里插入图片描述

在这里插入图片描述

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

状态模式

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

策略模式

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

访问者模式

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于Zotero

1、文献数据库&#xff1a; Zotero的安装 Zotero安装使用_zotero只能安装在c盘吗-CSDN博客 2、如何使用zotero插件 我刚下载的时候就结合使用的是下面的这两个博主的分享&#xff0c;感觉暂时是足够的。 Zotero入&#x1f6aa;基础 - 小红书 Green Frog申请easyscholar密钥…

Linux实验报告15-添加系统调用

目录 一&#xff1a;实验目的 二&#xff1a;实验内容 &#xff08;1&#xff09;查看系统内核版本 &#xff08;2&#xff09;安装内核版本源码 &#xff08;3&#xff09;修改注册表 &#xff08;4&#xff09;添加系统调用头文件 &#xff08;5&#xff09;实现系统调…

使用Clion在ubuntu上进行交叉编译,并在Linux上远程编译五子棋

目录 1.工具以及概念介绍 &#xff08;1&#xff09;Clion软件简介 &#xff08;2&#xff09;交叉编译 &#xff08;3&#xff09;远程编译 2.操作原理 3.详细操作步骤 &#xff08;1&#xff09;配置Clion与虚拟机ubuntu的ssh连接 CLion远程开发Ubuntu&#xff0c;并显…

Unity UGUI使用技巧与经验总结(不定期更新)

Text自动缩放参考连接&#xff1a; Unity -UGUI中Text文本框的自动调整&#xff0c;字体大小的自适应调节_unity添加的字体大小锁定-CSDN博客 Toggle按钮选择时&#xff0c;显示对应的UI界面&#xff1a; 为Toggle组件的On Value Change事件添加对需要显示的对象的SetActive…

无刷直流电机偏移角度

1、问题引入 (1)电机偏移角度是什么&#xff1f;若偏移角度不为0&#xff0c;如何让电机转起来&#xff1f; 1.1 GPT答案1 电机偏移角度的定义 电机的偏移角度是指电机的实际转子磁场位置与控制系统所认为的转子磁场位置之间的误差角度。这个误差可能是由于霍尔传感器安装不…

GitHub的简单操作

引言 今天开始就要开始做项目了&#xff0c;上午是要把git搭好。搭的过程中遇到好多好多的问题。下面就说一下git的简单操作流程。我们是使用的GitHub,下面也就以这个为例了 一、GitHub账号的登录注册 https://github.com/ 通过这个网址可以来到GitHub首页 点击中间绿色的S…

SD下载、安装、使用、卸载-Stable Diffusion整合包v4.10发布!

目录 前言概述 SD安装1、安装软件2、启动3、配置4、运行5、测试 导入SD模型【决定画风】常用模型下载安装模型 SD卸载SD文生图提示词提示词使用技巧提示词的高级使用技巧强调关键词 前言 我向来不喜欢搞一些没有用的概念&#xff0c;所以直接整理可能用到的东西。 sd简单的说…

CDN SSLTLS以及安全

随着互联网的发展&#xff0c;内容分发网络&#xff08;CDN&#xff09;在提升网站访问速度和安全性方面发挥了重要作用。然而&#xff0c;CDN在带来便利的同时也面临一些安全挑战。本文将探讨CDN的安全风险&#xff0c;并深入解析SSL/TLS加密技术及其在CDN中的应用。 CDN的安全…

电子电气架构 --- 中央处理器HPC及软件架构

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…

手写顺序流程图组件

效果图 完整代码 <template><div><div class"container" :style"{ width: ${spacingX * (colNum - 1) itemWidth * colNum}px }"><divv-for"(item, i) in recordList":key"i"class"list-box":style&…

html+css+js网页设计 美食 好厨艺西餐美食企业网站模板6个页面

htmlcssjs网页设计 美食 好厨艺西餐美食企业网站模板6个页面 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 …

Vue3中使用 Vue Flow 流程图方法

效果图&#xff1a; 最近项目开发时有一个流程图的功能&#xff0c;需要做流程节点的展示&#xff0c;就搜到了 Vue Flow 这个插件&#xff0c;这个插件总得来说还可以&#xff0c;简单已使用&#xff0c;下边就总结一下使用的方法&#xff1a; Vue Flow官网&#xff1a;https…

37. 数组二叉树

一、题目描述 二叉树只也可以用数组来存储&#xff0c;给定一个数组&#xff0c;树的根节点的值储存在下标1&#xff0c;对于储存在下标n的节点&#xff0c;他的左子节点和右子节点分别储存在下标2n和2n1&#xff0c;并且我们用-1代表一个节点为空&#xff0c;给定一个数组存储…

网关的主要类型和它们的特点

网关&#xff0c;作为网络通信的关键节点&#xff0c;根据其应用场景和功能特点&#xff0c;可以分为多种类型。 1.协议网关 特点&#xff1a; • 协议转换&#xff1a;协议网关的核心功能是转换不同网络之间的通信协议。例如&#xff0c;它可以将IPv4协议的数据包转换为IPv6协…

JAVA学习笔记_JVM

文章目录 初识jvm内存结构程序计数器(寄存器) 栈问题辨析内存溢出 线程诊断本地方法栈Heap堆内存溢出内存诊断 方法区内存溢出常量池 stringTable直接内存垃圾回收 初识jvm JRE JVM 基础类库 JDK JRE 编译工具 JavaSE JDK IDE工具 JavaEE JDK 应用服务器 IDE工具 jvm是…

无线AP安装注意事项

现在的办公楼、酒店等项目中都设计含有网络无线覆盖这一项&#xff0c;在项目实施中&#xff0c;往往采用的是便捷并且后期便于网络无线设备管理的无线ap设备&#xff0c;作为前端无线信号的覆盖。在具体安装无线AP过程中&#xff0c;我们必须要注意以下几点才能保证项目实施完…

PHP框架+gatewayworker实现在线1对1聊天--聊天界面布局+创建websocket连接(5)

文章目录 聊天界面布局html代码 创建websocket连接为什么要绑定&#xff1f; 聊天界面布局 在View/Index目录下创建index.html html代码 <div id"chat"><div id"nbar"><div class"pull-left">与牛德胜正在聊天...</div…

毕设中所学

1、交叉引用 在毕业设计论文Word中交叉引用参考文献_交叉引用如何标注[1~6]-CSDN博客 另&#xff1a;将标号或其他文字改为上标的快捷键是CtrlShift。 图的交叉引用一样&#xff0c;修改引用类型即可。 2、ENVI安装 ENVI5.6 安装教程&#xff0c;新手入门&#xff08;超详细…

xilinx的高速接口构成原理和连接结构及ibert工具的使用-以k7 GTX为例

一、相关简介 Xilinx的高速接口称之为transceivers(高速收发器&#xff09;&#xff0c;这部分的电路是专用电路&#xff0c;供电等都是独立的&#xff0c;根据速率可以分为GTP/GTX/GTH/GTY/GTM等。 Xilinx的高速接口是QUAD为单位的&#xff0c;没一个QUAD由一个时钟COMMON资…

Formality:官方Tutorial(一)

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 本文是对Synopsys Formality User Guide Tutorial中第一个实验的翻译&#xff08;有删改&#xff09;&#xff0c;Lab文件可以从以下链接获取。 Formality官方Tu…