【设计模式】23种设计模式笔记

设计模式分类

在这里插入图片描述

模板方法模式

核心就是设计一个部分抽象类。
这个类具有少量具体的方法,和大量抽象的方法,具体的方法是为外界提供服务的点,具体方法中定义了抽象方法的执行序列

装饰器模式

现在有一个对象A,希望A的a方法被修饰
实现思路:

  1. 将A抽象成抽象类O
  2. 装饰器类D来继承O,并聚合O
  3. 装饰器类D的构造函数传参O,并赋值给所聚合的O
  4. 装饰器类D可以不用实现a方法,保持抽象
  5. 具体装饰类D1继承装饰器类D,新增修饰方法d1,然后再重写a方法,重写内部使用修饰方法d1并调用super.a
  6. 具体装饰类D2继承装饰器类D,新增修饰方法d2,然后再重写a方法,重写内部使用修饰方法d2并调用super.a
  7. ……
  8. 使用时,新建原始对象A,把A传入D1构造器并再次用A接收,再把A传入D2构造器并再次用A接收,……于是实现了多重装饰(每一层装饰都对上层屏蔽了下层细节)

适配器模式

实现适配器之前:
在这里插入图片描述
实现适配器之后:
继承方式实现:
在这里插入图片描述
委托方式实现:
在这里插入图片描述

代理模式

代理模式和装饰器模式在作用上类似,不过代理模式侧重于缓解原对象的某些繁重的工作,而装饰器模式侧重于对原对象的某些行为进行修饰和控制

简单工厂、工厂方法、抽象工厂、建造者模式的对比

始终保持面向“产品”思考
当仅需要创造一类产品,且产品内部类别不多时,使用简单工厂模式:
在这里插入图片描述
当仅需要创造一类产品,但产品内部类别纷繁且多变时,使用工厂方法模式:
在这里插入图片描述
当需要创造多类产品,且产品内部类别纷繁且多变时,使用抽象工厂模式:(抽象工厂模式可以用来制造复杂的产品,“将关联零件组装成产品”)
在这里插入图片描述
在抽象工厂模式下,一个最终产品往往是由多个部分组成的,如上图中最终产品就是由产品A和产品B共同组成的,这就导致一个问题:可能由于客户端代码的编写疏忽而导致漏掉某一个部分。于是有了建造者模式:
在这里插入图片描述
建造者模式中新增了Director类,它就相当于一个“保险类”,在Director内部提前编写好没有遗漏任何一个部分的组装流程,然后暴露一个简单的SAP——construct方法直接由客户端调用,这样客户端就从如履薄冰的复杂构造过程中解放了出来,降低了出错的概率

组合模式

一句话精髓——容器与内容的一致性
最好的例子——文件和文件夹的例子
在这里插入图片描述
组合模式最特别的地方就是Composite类含有一个对抽象的Component的聚合

Flyweight模式,享元模式

在这里插入图片描述

Facade模式,外观模式

一句话总结——接口(API)变少了
在这里插入图片描述

Visitor模式,观察者模式

《图解设计模式》这本书太好了,一段话就能把一个设计模式的关键讲清楚:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【申请体验Sora】OpenAI Red Teaming Network application

网址:https://openai.com/form/red-teaming-network 使用Gmail , 国家选美国 两个问题: Why are you interested in joining the OpenAI Red Teaming Network? I’m eager to experience the powerful allure of Sora, which I believe wi…

2024.2.20

使用多进程完成两个文件的拷贝&#xff0c;父进程拷贝前一半&#xff0c;子进程拷贝后一半&#xff0c;父进程回收子进程的资源 #include<myhead.h> int main(int argc, const char *argv[]) {char str[100]"";puts("please input str:");//从终端读…

最高频率的图形工作站应用配置推荐

如果你的计算机速度太慢&#xff0c;想买一台最快的图形工作站&#xff0c;大幅提高你的工作效率&#xff0c;从专业角度&#xff0c;这种图形工作站不是唯一的&#xff0c;原因是&#xff0c;不同的应用、不同的算法、不同计算规模&#xff0c;硬件配置有很大差异&#xff0c;…

哈希应用位图 | 位图概述与代码实现 | 关于位图的几个面试题

文章目录 1.位图的概述与实现1.1.位图的引出与概述1.2.位图的代码实现1.3.位图的应用及其他面试题 1.位图的概述与实现 当然C库中也有位图的实现&#xff1a;链接 1.1.位图的引出与概述 面试题&#xff1a;给40亿个不重复的无符号整数&#xff08;0~2^32&#xff09;&#xf…

leetcode 01背包问题

典型的01背包问题可以暴力求解&#xff0c;直接将所有可能全部遍历然后挑选符合条件的即可&#xff0c;但这样时间复杂度过高&#xff0c;有2的n次方。 所以我们在这里采用动态规划的方式来做&#xff0c;并且&#xff0c;我们可以采用二维数组或者一维数组来做。 二维数组&a…

SpringBoot项目启动报java.nio.charset.MalformedInputException Input length = 1解决方案

报错详情 SpringBoot启动报错java.nio.charset.MalformedInputException: Input length 1 报错原因 出现这个的原因&#xff0c;就是解析yml文件时&#xff0c;中文字符集不是utf-8的原因&#xff0c;这是maven在项目编译时&#xff0c;默认字符集编码是GBK。 解决方式 检…

PCL 计算点云AABB包围盒的体积

目录 一、AABB包围盒二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。爬虫自重,把自己当个人。 一、AABB包围盒 AABB包围盒又称了 轴对齐包围盒,是点云包围盒里最简单的一种,其计算方法也极其简单。获取包围盒之后,根据包围盒的长宽高进行体积计算即…

小米14 ULTRA:重新定义手机摄影的新篇章

引言 随着科技的飞速发展&#xff0c;智能手机已经不仅仅是一个通讯工具&#xff0c;它更是我们生活中的一位全能伙伴。作为科技领域的佼佼者&#xff0c;小米公司再次引领潮流&#xff0c;推出了全新旗舰手机——小米14 ULTRA。这款手机不仅在性能上进行了全面升级&am…

spring boot3参数校验基本用法

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途。 目录 前置条件 前言 导入依赖 使用介绍 配置检验规则 开启校验 使用注意 全局异常捕获返回友好提示信息 常用的校…

LeetCode94.二叉树的中序遍历

题目 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 &#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 思路 中序遍历的顺序是左子树 -> 根节点 -> 右子树。因此&#xff0c;我们可以通过递归的方式遍历二叉树&…

Linux——进程替换

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、进程程序替换1、替换原理2、替换函数3、函数解释4、命名理解 二、用例测试1、execl测试2、…

C#分部类的应用:记录学生信息

目录 一、分部类及其用途 二、实例 再发一个分部类的应用&#xff0c;巩固一下。 一、分部类及其用途 C#中的部分类也被称为分部类。 C#中的部分类是一种将类的定义分成多个部分&#xff0c;每个部分都位于自己的文件中&#xff0c;然后在编译时合并在一起的机制。 部分类…