【设计模式学习笔记】设计模式的分类

目录

  • 分类
  • 创建型模式
    • 创建型模式之间的对比
  • 结构型模式
    • 结构型模式之间的对比
  • 行为型模式
    • 行为型模式之间的对比
  • 总结
    • 小提醒
  • 参考

分类

常规的分类方式是根据其作用来划分,总共有三类:创建型模式、结构型模式和行为型模式。

创建型模式

该模式提供了一种在创建对象的同时隐藏创建逻辑的方式,不使用new运算符直接实例化对象,它的主要特点是将对象的创建与使用分离

模式功能
单例模式全局变量
简单工厂模式根据参数构造对象,仅仅是对new的封装,不符合开闭原则
工厂方法模式以继承的方式,父类定义接口,在子类中构造对象
抽象工厂模式相对于工厂方法模式,每个工厂可以构造同一类对象,这一类对象继承自同一个父类
原型模式将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例
建造者模式将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示

创建型模式之间的对比

模式对比
工厂方法模式 vs 建造者模式工厂方法模式用于创建简单对象,往往一步就可以创建一个完整对象;而建造者模式用于创建相对复杂的对象,需要多个步骤、多次操作来构建一个完整的对象,增加了可定制性和灵活性

结构型模式

该模式关注类和对象的组合,即如何将类或对象按某种布局组成更大的结构

模式功能
装饰模式向现有的对象添加新的功能,同时又不改变其结构,即动态地给一个对象添加一些额外的职责
外观模式封装子系统,该封装需要保持不变,子系统可以随意修改,而客户端不会感知
组合模式将对象组合成树形结构以表示"部分-整体"的层次结构,使得用户对单个对象和组合对象的使用具有一致性
享元模式运用共享技术来有效地支持大量细粒度对象的复用,有点像是一个编程技巧
代理模式为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性
适配器模式转换接口
桥接模式用组合的方式解决子类数量爆炸的问题

结构型模式之间的对比

模式对比
装饰模式 vs 适配器模式装饰器侧重动态的增加功能,而适配器模式只是接口的适配,功能没有变化
装饰模式 vs 代理模式两者都可以增强或者削弱被装饰类或者被代理类的能力,但是装饰模式一般采用继承方式实现,会暴露更多的细节。而代理模式采用组合方式,对于调用者而言完全透明,可以有更多的灵活性
外观模式 vs 代理模式两者的实现非常像,主要区别在于实现意图,外观模式在于封装,而代理模式在于能力的增强

总体来说,上面集中模式比较难以区分,其实实际使用中也不必强行分类,核心是分析业务中稳定部分与不稳定部分。适配器模式,代理模式,外观模式都是将稳定部分抽象成接口,将不稳定部分封装起来。对于装饰模式,我更喜欢将其封装起来,对我提供配置参数,对于调用者而言结构更加简洁。

对于接口设计而言,在实践中悟出道理是:接口要尽可能简洁,能一个方法,就不两个方法,能一个参数,就不两个参数,能一个字母,就不两个字母。因为越是精简,出错的概率就越低。

行为型模式

该模式用于描述类或对象之间怎样通信、协作共同完成任务,以及怎样分配职责。

模式功能
模板方法模式定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。核心是找到变化点,分离变化到子类中
策略模式定义一系列算法,将每个算法封装起来,使它们可以相互替换(同一个功能的不同实现)
观察者模式多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为,常见的是:发布-订阅
命令模式将一个动作封装成一个对象,该对象可以通过函数参数等方法传递和处理
迭代器模式提供一种方法来顺序访问(遍历)聚合对象中的一系列数据,而不暴露聚合对象的内部表示
状态模式允许一个对象在其内部状态改变时,改变它的行为,对象看起来似乎改成了其他类的对象(行为层面)
中介者模式定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度
备忘录模式在不破坏封装性的前提下,获取并保存一个对象的内部状态,以便以后恢复它,撤销-恢复。如果需要保存对象全部内部状态,采用原型模式更好
职责链模式将请求的发送者和接收者解耦,而且接收者是多个,每个接收者记录下一个接收者地址,这样便形成了一条链,请求可以在这条链上传递,并被处理
访问者模式允许一个或者多个操作应用到一组对象上,使对象本身和操作解耦
解释器模式定义一个语言的文法,并建立一个解释器解释该语言中的句子

行为型模式之间的对比

模式对比
策略模式 vs 访问者模式策略模式的核心思想是将算法的实现和使用分离,客户端可以根据需要选择不同的算法来完成相同的任务。访问者模式的核心思想是将数据结构和数据操作分离,通过访问者来实现对数据的操作。
命令模式 vs 职责链模式命令模式的核心思想是将请求封装成一个命令对象,然后由调用者发送命令给接收者来执行。职责链模式的核心思想是将多个处理者组成一条链,每个处理者都有机会处理请求,如果一个处理者无法处理该请求,则将请求传递给下一个处理者。

总结

以上设计模式相当于都是具体的套路,其中蕴含的思想及原则才是最为本质和通用的东西,这也正是设计模式所追求的。在使用设计模式过程中,我们需要努力的提炼出一些本质的,共性的内容,把这些共性的内容封装到一起,使其与具体的,特殊的内容分开。核心是发现不变的部分和变化的部分,减少代码的重复,提高代码的扩展能力。在实现手段上往往采用多态的方式。另外,六大原则也是指导合理使用设计模式的利器。

  1. 单一职责原则
  2. 开闭原则:对扩展开放,对修改关闭
  3. 里氏替换原则:任何父类可以出现的地方,子类一定可以出现
  4. 依赖倒置原则:程序要依赖于抽象接口,不要依赖于具体实现
  5. 组合复用原则:尽量先使用组合、聚合等关联关系来实现,其次才考虑使用继承关系来实现
  6. 迪米特法则:一个对象对其他对象的了解尽可能少,从而降低各个对象之间的耦合,即高内聚低耦合。

小提醒

  1. 当系统的设计不需要预留任何弹性时,就不需要使用模式
  2. 模式会带来复杂性和降低程序运行效率,除非必要,否则不要着急使用模式
  3. 设计模式不能解决软件开发中遇到的所有问题
  4. 不写代码的架构师是值得怀疑的架构师
  5. 对于大型项目,细致的需求分析和架构设计非常非常重要,特别是需求分析。自顶向下的设计,不要一上来就设计类,应当划分模块(子系统),模块之间的交互逻辑,接口,参数等

参考

  1. https://blog.csdn.net/m0_37741420/article/details/106169752
  2. C++新经典:设计模式,王健伟
  3. 【模式对比】适配器 VS 装饰器
  4. 代理模式和装饰器模式的区别
  5. 【模式对比】工厂方法 VS 建造者
  6. 学习6大设计原则、23种设计模式

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

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

相关文章

攻击简写及全名

一、简称及全名 1、Dos攻击--》拒绝服务攻击。 2、DDos攻击--》分布式拒绝服务攻击。 3、DHCP--》Dynamic Host Configuration Protocol--》动态主机配置协议(静态IP、自动获取ip地址)。 4、NetBIOS--》NetBIOS Services Protocols--》网络基本输入/…

Isaac Sim 6 仅使用isaacsim中自带的工具进行语义分割、实例分割(学习笔记5.09)

一.概要 建立场景,给场景内的物体赋予语义,使用Replicator进行分割操作,从而获得带标签信息的mask掩码图,可作为数据集、验证集等训练使用。 二.具体操作步骤 场景部分 1.搭建一个基础场景 这里建议在搭建的时候就按类别分好类…

变配电工程 变配电室智能监控系统 门禁 视频 环境 机器人

一、方案背景 要真正了解无人值守配电房的运行模式,我们必须对“无人值守”这一概念有准确的理解。它并不意味着完全没有工作人员管理,而是通过技术设备和人机协作来确保配电房的正常运行。 利用变配电室智能监控系统,可以实时获得配电室各…

44.乐理基础-音符的组合方式-附点

内容参考于: 三分钟音乐社 首先如下图,是之前的音符,但是它不全,比如想要一个三拍的音符改怎样表示? 在简谱中三拍,在以四分音符为一拍的情况下,在后面加两根横线就可以了,称为附点…

基于Unity为Vision Pro 构建游戏的4个关键

为Vision Pro开发游戏时需要考虑的四个关键概念:输入的自然性、物理尺寸的真实匹配、交互空间的充足性以及Unity组件的有效利用。 AVP交互小游戏(Capsule Critters)作者分享了使用Unity构建的几个核心关键: Bounded - 游戏定义:Bounded(有限)是Unity的术语,指的是游戏作…

利用“AnaTraf“网络流量分析仪轻松诊断和优化网络

网络性能监测和诊断(NPMD)是网络管理和优化的重要环节,准确快速地定位和排除网络故障对于保障业务正常运转至关重要。作为一款专业的网络流量分析设备,AnaTraf网络流量分析仪凭借其强大的流量分析和故障诊断功能,为网络管理者提供了一个高效的网络优化解决方案。 全面掌握网络…

【Ubuntu18.04+melodic】抓取环境设置

UR5_gripper_camera_gazebo(无moveit) 视频讲解 B站-我要一米八了-抓取不止!Ubuntu 18.04下UR5机械臂搭建Gazebo环境|开源分享 运行步骤 1.创建工作空间 catkin_make2.激活环境变量 source devel/setup.bash3.1 rviz下查看模…

如何判断nat网络?如何内网穿透

大家都清楚,如果你想开车,就必须要给车上一个牌照,随着车辆越来越多,为了缓解拥堵,就需要摇号,随着摇号的人数越来越多,车牌对于想开车的人来说已经成为奢望。在如今的IPv4时代,我们…

TODESK怎么查看有人在远程访问

odesk怎么查看有人在远程访问 Todesk作为一款远程桌面控制软件,为用户提供了便捷的远程访问与控制功能。但在享受这种便利的同时,许多用户也关心如何确保自己设备的安全,特别是如何知道是否有人在未经授权的情况下远程访问自己的电脑。本文将…

OpenAI 希望您对其人工智能模型的行为发表意见

OpenAI 公布了一套高级“生活”指南,称为模型规范,该指南将定期更新,并确定其 AI 模型(例如 ChatGPT 和 DALL-E)在某些情况下的行为方式。 他们发布了初稿,并询问使用其模型的公众和利益相关者&#xff08…

大模型LLM之SFT微调总结

一. SFT微调是什么 在大模型的加持下现有的语义理解系统的效果有一个质的飞跃;相对于之前的有监督的Pre-Train模型;大模型在某些特定的任务中碾压式的超过传统nlp效果;由于常见的大模型参数量巨大;在实际工作中很难直接对大模型训…

【沐风老师】3DMAX百叶窗修改器LouverGenerator安装使用方法

3DMAX百叶窗修改器LouverGenerator安装使用方法 3DMAX百叶窗修改器,在单面几何对象(或二维图形)范围内,创建百叶窗结构模型的修改器插件。修改器参数可设置动画效果。 【版本要求】 3dMax 2018及更高版本 【安装方法】 1.点击3d…

调用 gradio 创建聊天网页报错(使用远程服务器)

文章目录 写在前面1、使用默认IP地址(失败)2、使用本地IP地址(失败)3、使用远程服务器IP地址(成功) 写在前面 我复现了github上的 llama-chinese 的工作 使用的是 llama2,环境配置是在远程服务…

用手势掌控PPT,玩转演示新姿势

推荐运行环境 使用anaconda创建环境,以免污染原来的python开发环境conda install python3.9pip install -q mediapipe0.10.0pip install pyautoguiPython: version 3.8 - 3.11PIP: version 20.3 请注意以下的坑 以下为我测试过程中的大坑,请及时避开&am…

python3.12.0 在Linux 制作镜像包 部署到docker 全过程

项目结构: 比如,在pycharm里需要运行 themain.py 1、上传Linux的目录结构: Dockerfile 文件需要制作: 这里是关键: #基于的基础镜像 FROM python:3.12.0 #代码添加到code文件夹 ADD ./EF_NFCS /code #设置code文…

uniapp:抖音PK进度条(nvue)

nvue中,仿抖音PK进度条效果, <template><view class="index" :style="{width:windowWidth+px,height:index_windowHeight+px,paddingTop:windowTop+px}"><view class="pk"><text class="pk_jindu_left_val fsz-24 …

【Leetcode每日一题】 分治 - 交易逆序对的总数(难度⭐⭐⭐)(74)

1. 题目解析 题目链接&#xff1a;LCR 170. 交易逆序对的总数 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 归并排序的基本思路 归并排序将数组从中间分成两部分&#xff0c;在排序的过程中&#xff0c;逆序对的来…

OV SSL比DV SSL更好吗

直接说结论&#xff0c;OV证书相较于DV证书而言&#xff0c;性能更加强大&#xff0c;加密等级以及加密方式也更优&#xff0c;从安全的角度上来说&#xff0c;OV证书会比DV证书拥有更多的优势。 不同于DV SSL证书申请只需要验证域名所有权&#xff0c;申请OV SSL证书除了会验…

液压阀比例电磁铁控制放大器

液压阀比例电磁铁控制放大器是一种将电信号精确转换为液压动力的技术&#xff0c;用于实现对液压系统的精细控制。与传统的开关型电磁铁不同&#xff0c;比例电磁铁可以实现连续控制&#xff0c;允许进行微调以适应不同的控制需求。比例液压阀包括比例压力阀、比例流量阀等&…

SparkSQL概述

1.1. SparkSQL介绍 SparkSQL&#xff0c;就是Spark生态体系中的构建在SparkCore基础之上的一个基于SQL的计算模块。SparkSQL的前身不叫SparkSQL&#xff0c;而是叫做Shark。最开始的时候底层代码优化、SQL的解析、执行引擎等等完全基于Hive&#xff0c;总是Shark的执行速度要比…