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

目录

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

分类

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

创建型模式

该模式提供了一种在创建对象的同时隐藏创建逻辑的方式,不使用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.mfbz.cn/a/609520.html

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

相关文章

django项目结构介绍

小白的django学习笔记 五一前的某天 文章目录 django项目结构介绍项目的基本配置templates项目模块manage.pyExternal Libraries django项目结构介绍 项目的基本配置 在这里配置,跟工程名是一样的 templates 放网页、js、css的地方 django 项目模块 项目开发时&…

《前端算法宝典:双指针问题解析与应用》

双指针 双指针,指的是在遍历对象的过程中使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针或者是两个指针构成一个滑动窗口进行扫描,从而达到相应的目的。 双指针方法在某些情况下可以对有序数组…

sbt安装

一、sbt介绍 在Spark中,sbt(Scala Build Tool)是一个用于构建Scala项目的工具。它是Spark项目的主要构建工具之一,用于编译Scala代码、管理依赖项、打包应用程序以及执行其他与项目构建相关的任务。 sbt的用途在Spark开发中主要…

『大模型笔记』Google CEO Sundar Pichai(桑达尔·皮查伊)谈人工智能的未来!

Google CEO Sundar Pichai(桑达尔皮查伊)谈人工智能的未来! 文章目录 一. Google CEO谈人工智能的未来总结摘要观点时间线二. 参考文献简短总结:一. Google CEO谈人工智能的未来 总结 主要介绍了Google CEO Sundar Pichai对人工智能未来的看法,以及Google在AI领域的战略…

JavaScript异步编程——06-Promise入门详解【万字长文,感谢支持】

前言 Promise 是 JavaScript 中特有的语法。可以毫不夸张得说,Promise 是ES6中最重要的语法,没有之一。初学者可能对 Promise 的概念有些陌生,但是不用担心。大多数情况下,使用 Promise 的语法是比较固定的。我们可以先把这些固定…

三月份饮料行业线上市场销售数据分析

2024年3月,中国饮料市场呈现出多样化和健康趋势的明显特征。从消费场景、消费端需求以及销售渠道来看,饮料市场正在经历多元化的发展,这不仅体现在产品种类上,也体现在消费者的购买行为和偏好上。 据鲸参谋数据统计,线…

LLM大语言模型(十五):LangChain的Agent中使用自定义的ChatGLM,且底层调用的是remote的ChatGLM3-6B的HTTP服务

背景 本文搭建了一个完整的LangChain的Agent,调用本地启动的ChatGLM3-6B的HTTP server。 为后续的RAG做好了准备。 增加服务端role:observation ChatGLM3的官方demo:openai_api_demo目录 api_server.py文件 class ChatMessage(BaseModel…

LeetCode HOT 100刷题总结

文章目录 1 哈希1.1 1-1.两数之和🟢1.2 2-49.字母异位词分组🟡1.3 3-128.最长连续序列🟡 2 双指针2.1 4-283.移动零🟢2.2 6-15.三数之和🟡2.3 7-11.盛最多水的容器🟡2.4 8-42.接雨水🔴 3 滑动窗…

传输层协议——UDP协议

目录 一、传输层 二、再谈端口号 端口号的划分 知名端口号 pidof netstat命令 三、UDP协议 1、UDP协议格式 2、UDP协议特点 3、UDP协议的缓冲区 四、基于UDP的应用层协议 一、传输层 上一篇文章我们所讲到的HTTP协议和HTTPS协议,是属于应用层协议。我们…

【小笔记】问答系统可视化实现的三种方式

下面三种方式都是基于Python的哈,从简单到复杂。 方式一:命令行交互问答 优点:原始简单直接 方式二:使用Python可视化框架 优点:无需学习前端技术栈即可搭建一个web。 streamlit:⭐️⭐️⭐️⭐️gra…

【服务器优化】LVS负载均衡

LVS负载均衡 LVS简介 ​ LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中。该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,终…

nginx的应用部署nginx

这里写目录标题 nginxnginx的优点什么是集群常见的集群什么是正向代理、反向代理、透明代理常见的代理技术正向代理反向代理透明代理 nginx部署 nginx nginx(发音同enginex)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3&…

Java设计模式 _结构型模式_外观模式

一、外观模式 1、外观模式 外观模式(Facade Pattern)是一种结构型模式。主要特点为隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这有助于降低系统的复杂性,提高可维护性。当客户端与多个子系统之间存在大量…

FPGA+海思ARM方案,可同时接收HDMI/VGA 两种信号,远程控制

FPGA海思ARM方案,可同时接收HDMI/VGA 两种信号,通过配置输出任一图像或者拼接后的图像 客户应用:无线远程控制 主要特性: 1.支持2K以下任意分辨率格式 2.支持H264压缩图像 3.支持WIFI/4G无线传输 4.支持自适应输入图像分辨率 …

如何编辑百度百科里面的资料

编辑百度百科资料是一个相对简单的过程,但同时也需要遵循一定的规则和流程。以下是百科优化网yajje整理的编辑百度百科资料的步骤和注意事项。 登录账户 首先,编辑百度百科需要一个百度账号。如果没有,你需要先注册一个。登录后,…

西奥机电CLRT-01:重塑碳酸饮料质检新纪元

西奥机电CLRT-01:重塑碳酸饮料质检新纪元 在追求品质生活的今天,碳酸饮料的品质检测成为了行业内外关注的焦点。西奥机电,作为行业创新的领跑者,携其最新研发的CLRT-01二氧化碳气容量测试仪,为碳酸饮料行业带来了革命性…

一文详解|影响成长的关键思考(二)

之前写过一篇《一文详解|影响成长的关键思考》,里面对自己工作前几年的心法进行了总结,并分享了出来。现在又工作了一段时间后,有了一些新的体会,想进一步分析一下,于是便有了此文。的确,思考也…

LeetCode63:不同路径Ⅱ

题目描述 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。 现在考虑网格中有障碍物。那么从左上角…

【NPS】微软NPS配置802.1x,验证域账号,动态分配VLAN(NPS篇)

NPS简介 Network Policy Server(NPS)是微软Windows Server中的一个网络服务,它作为RADIUS服务器实现,用于集中管理网络接入请求。NPS处理对网络资源的认证、授权和审计请求,通常用于控制远程访问VPN和无线网络的接入。…

Python 数据库操作- sqlite3 模块

Python sqlite3 模块 1. 安装 SQLite3 可使用 sqlite3 模块与 Python 进行集成。sqlite3 模块是由 Gerhard Haring 编写的。它提供了一个与 PEP 249 描述的 DB-API 2.0 规范兼容的 SQL 接口。用户不需要单独安装该模块,因为 Python 2.5.x 以上版本默认自带了该模块…
最新文章