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

news2025/1/12 18:09:59

设计模式分类

在这里插入图片描述

模板方法模式

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

装饰器模式

现在有一个对象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.coloradmin.cn/o/1459489.html

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

相关文章

Android挖取原图中心区域RectF(并框线标记)放大到ImageView宽高,Kotlin

Android挖取原图中心区域RectF(并框线标记)放大到ImageView宽高,Kotlin 红色线框区域即为选中的原图中心区域,放大后放到等宽高的ImageView里面。 import android.content.Context import android.graphics.Bitmap import android.graphics.BitmapFactor…

Mybatis | 初识Mybatis

初识Mybatis 目录: 初识Mybatis什么是Mybatis?Hibernate 和 MyBatis的区别?Mybatis的下载和使用Mybatis的工作原理 作者简介 :一只大皮卡丘,计算机专业学生,正在努力学习、努力敲代码中! 让我们一起继续努力学习&#…

牛客网 OR141 密码检查

答案&#xff1a; #include <stdio.h> #include <string.h> #include <ctype.h> int main() {int n 0;int count1 0, count2 0, count3 0;scanf("%d", &n);while (n--){char ch[100];scanf("%s", ch);int len strlen(ch);if (…

UE5 C++ UENUM 和 USTRUCT

一.首先在APawn里声明 UENUM 和 USTRUCT。UENUM 有两种定义方式 一种是使用命名空间&#xff1a; 还有是继承uint8&#xff1a; 通过申明class类 别名来替代 USTRUCT的定义 上面的第二种有类似但仍然有很多的差异&#xff1a; 首先要有GENERATED_USTRUCT_BODY()这个函数 并且…

element-ui 自定义表头label(利用 :slot=“header“ slot-scope=“slot“)

<el-table :data"Gbtable" border style"width: 100%"><el-table-column prop" date" label"责任方" align"center" ></el-table-column><el-table-column prop"name" label"柜名"…

图片文字编辑软件app分享5个!

在数字化时代&#xff0c;图片和文字的结合已经成为信息传播的重要形式之一。无论是制作精美的海报、设计独特的社交媒体封面&#xff0c;还是简单地为图片添加一些说明性文字&#xff0c;都离不开专业的图片文字编辑软件。今天&#xff0c;就让我们一起探索那些不可错过的图片…

ai自动证件照片制作的软件?分享3款先进工具!

随着科技的发展&#xff0c;我们的生活变得越来越便捷。尤其在图像处理领域&#xff0c;AI技术的应用更是让许多传统行业焕发出新的活力。其中&#xff0c;AI证件照制作工具就是近年来备受瞩目的创新产品。这些工具利用先进的AI技术&#xff0c;帮助用户在家中就能轻松制作出专…

【git 使用】使用 git rebase -i 修改任意的提交信息/合并多个提交

修改最近一次的提交信息的方法有很多&#xff0c;可以参考这篇文章&#xff0c;但是对于之前的提交信息进行修改只能使用 rebase。 修改提交信息 假设我们想修改下面这个提交信息&#xff0c;想把【登录】改成【退出登录】步骤如下 运行 git rebase -i head~3 打开了一个文本…

open3d 点云体素化

open3d 点云体素化 一、算法原理1.从点云到体素化&#xff08;主要函数&#xff09;2.从网格到体素化&#xff08;主要函数&#xff09; 二、代码三、结果1.从点云到体素化2.从网格到体素化 四、相关数据 一、算法原理 点云和三角网格是非常灵活但不规则的几何类型。体素网格是…

互联网大厂职级和薪资一览表!看看WebGIS能到多少级?

以上薪资来源网络&#xff0c;仅供参考。 我们再来看下这些大厂在招的webgis岗位薪资&#xff1a; 01. 华为职级和薪资水平 02. 华为WebGIS薪资 13-26K&#xff0c;经验不限 勉强能够上13级 03. 腾讯职级与薪资 04. 腾讯WebGIS薪资 13-35K&#xff0c;3-5年工作经验 范围挺…

linux系统---firewalld

目录 一、firewalld介绍 1.归入zone顺序 2.firewalld zone分类 3.预定义服务 二、图形化操作 1.打开firewalld图形化界面 2.以http服务为例&#xff0c;打开httpd服务 ​编辑 3.修改端口号 三、命令行配置 1.基础配置 2.查看现有firewalld设置 3.设置查看默认区 4.添…

【算法分析与设计】最大层内元素和

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给你一个二叉树的根节点 root。设根节点位于二叉树的第 1 层&#xff0c;而根节点的子节点位于第 2 层&#xff0c;依此类推。 请返…

进制hash

P3370 【模板】字符串哈希 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P3370 解题思路 1.开辟一个链式结构的数组&#xff08;vector&#xff09; 2.给出一个固定进制x&#xff0c;将一个串的每一个元素看做一个进制位上的数字 3.输入字符…

【Larry】英语学习笔记语法篇——非谓语动词和从句是一回事

目录 非谓语动词和从句是一回事 不定式&#xff1a;名词/形容词/副词 1、不定式 名词属性的不定式&#xff1a;作为主语、表语、宾语 形容词属性的不定式&#xff1a;作后置定语 副词属性的不定式&#xff1a;作状语 副词属性的不定式&#xff1a;作插入语 不定式的逻辑…

微信小程序上线发布流程

1、上传代码 2、登录小程序管理后台-提交审批 3、登录小程序管理后台-发布 4、基于小程序码进行推广

Sora 和之前 Runway 在架构上的区别

问&#xff1a;Sora 和之前 Runway 那些在架构上有啥区别呢&#xff1f; 答&#xff1a;简单来说 Runway 是基于扩散模型&#xff08;Diffusion Model&#xff09;的&#xff0c;而 Sora 是基于 Diffusion Transformer。 Runway、Stable Diffusion 是基于扩散模型&#xff08…

化学空间可视化(chemical space visualization)开源软件ChemPlot的安装及使用

文章目录 前言一、ChemPlot是什么&#xff1f;二、conda环境安装ChemPlot1. 创建conda环境2. 安装chemplot及需要的包3. 检验安装 三、使用步骤1. 化合物数据库可视化使用方法BBBP数据库的t-SNE降维后可视化&#xff1a;BBBP数据库的PCA降维后可视化&#xff1a;BBBP数据库的UM…

【.NET Core】常见C#代码约定

【.NET Core】常见C#代码约定 文章目录 【.NET Core】常见C#代码约定一、概述二、代码预定的目标三、代码约束工具和分析器四、C#语言准则五、字符串约定5.1 使用字符串内插来连接短字符串5.2 插入大文本时&#xff0c;使用System.Text.StringBuilder对象 六、数组约定七、委托…

【Java】上传图片至阿里云oss服务器,文件上传以及图片base64上传

目录 引入maven依赖编写ossUtil编写Controller使用接口工具进行测试测试表单文件上传测试base64文件上传 首先需要在阿里云上开通oss服务&#xff0c;并获取到以下四个信息 endpoint: 购买的服务器节点地址accessKeyId: 接入的keyIdaccessKeySecret: 接入的key秘钥bucketName&…

Nginx操作

文章目录 Nginx使用操作1. 安装nginx2. docker启动nginx3. 目录介绍4. 更改站点内容&#xff0c;初试一下(此步骤可以省略)5. nginx配置文件结构5.1 http配置示例5.2 server配置 Nginx使用操作 服务器: ubuntudocker内操作nginx 1. 安装nginx # 1. 查询nginx版本 sudo docker…