设计模式之禅笔记

article/2025/8/22 15:35:32

设计模式PK

创建类模式PK

工厂方法模式 VS 建造者模式

工厂方法模式注重的是整体对象的创建方法。建造者模式注重的是部件构建过程

工厂方法模式的对象粒度较粗,建造者模式的产品对象粒度较细。

抽象工厂模式 VS 建造者模式

抽象工厂模式也是注重产品的整体,不关心具体内部的构建过程。

结构类模式PK

代理模式 VS 装饰者模式

装饰模式是代理模式的一个特殊应用。两者的相同点是代理类与目标类都具有相同的接口,不同点是代理模式着重对代理过程的控制,而装饰者模式则是对类的功能进行加强或减弱,它注重类的功能变化。

代理模式是把当前的行为或功能委托给其他对象执行,代理类负责接口限定:是否可以调用真实角色,以及是否对发送到真实角色的消息进行变形处理,它不对主题角色(被代理类,目标类)的功能做任何处理。代理模式的极致就是AOP。

装饰者模式是在保证接口不变的情况下加强类的功能,它保证修饰后的对象功能比原始对象增强。不做准入条件判断和准入参数过滤。

JAVA IO 包大量使用了装饰者模式,InputStream等。

装饰者模式 VS 适配器模式

两者在类图上差别比较大,但是功能有相似的地方:都是包装,都是通过委托方式实现其功能。不同点是:装饰者包装的是相同接口的类。适配器模式则包装的是非相同接口的类。

不同

意图不同:装饰者模式加强功能,适配器模式则关注接口的转换。

包装对象不同:装饰者模式包装相同接口的类,适配器模式则是不同接口的类

场景不同:装饰者模式在需要增强的时候用,适配器是在对现有类无法改造的情况下使用

扩展性不同:装饰者模式容易扩展。适配器模式是一个转换桥梁。

行为类模式PK

命令模式 VS 策略模式

策略模式的意图是封装算法,它认为算法是完整的,不同策略之间是可替换的。

命令模式则是对动作的解耦,把一个动作分为执行对象(接收者角色),执行行为(命令角色),让2者相互独立而不互相影响。

总结

关注点不同:策略模式关注的是算法替换的问题。命令模式关注的是解耦的问题

角色功能不同:策略模式中的具体算法是一个完整的算法逻辑,它是不可拆分的。命令模式,它关注命令的实现,

使用场景不同:策略模式适用于算法要求变更的场景。命令模式适用于解耦2个对象的场景

策略模式 VS 状态模式

两者的类图很相似。但是,策略模式封装的是算法,算法之间没有交互,以达到算法可以自由切换的目标,而状态模式封装的是不同的状态,以达到状态变换,行为也变换

总结

  • 环境角色(context)的职责不同:

策略模式的context只是一个委托作用,负责算法的切换。状态模式的context需要登记状态的变化,与具体的状态类协作,共同完成状态切换行为随之切换的的任务。

  • 解决问题的重点不同:

策略模式主要解决内部算法切换的问题,保证内部算法改变对外界的影响降低最低,保证算法可以自由切换。状态模式主要解决状态变化而引起的行为变化。

  • 解决问题的方法不同:

策略模式只保证方法可切换,但是不决定用什么算法。状态模式对外暴露的是行为,状态的变化一般是由context和具体状态共同完成的。

  • 应用场景不同:

策略模式可以是一个对象,也可以是一个算法。算法必须是平行的。状态模式则要求有一系列的状态发生变化的场景,它要求是有状态有行为的场景。

  • 复杂度不同:

策略模式简单,状态模式复杂。

观察者模式 VS 责任链模式

相同点:都实现了事务的链条化处理。

总结

  • 链中的消息对象不同:

责任链中,传递过程中消息不变。观察者模式,可以根据需要变化消息格式。

  • 上下节点的关系不同:

责任链中,下级完全不关心上级是什么。观察者模式中,需要了解2者关系。

责任链中,消息从头到尾,一个方向。观察者模式,消息可以跳跃传递,也可以广播等。

跨模式PK

门面模式 VS 中介者模式

门面模式为复杂的子系统提供一个统一的访问界面,它定义的是一个高层接口,该接口使得子系统更加容易使用,避免外部模块深入到子系统内部而产生与子系统内部细节耦合的问题。

中介者模式使用一个中介对象来封装一系列同事对象的交互行为,它使各对象之间不再显式地引用,从而使其耦合松散,建立一个可扩展的应用架构。

总结

门面模式是以封装和隔离为主要任务,而中介者模式是以调和同事类之间的关系为主,因为要协调,所以有了部分逻辑控制。两者主要差异:

  • 功能区别:

门面模式只是增加了一个门面,它对于子系统来说没有增加任何功能。中介者模式也业务功能,它把同事类之间的耦合移到了中介者,同事类不可能脱离中介者而独立。

  • 知晓状态不同:

门面模式,子系统不知道门面存在。中介者模式,每个同事类都知道中介者存在。

  • 封装程度不同:

门面模式是简单封装,每个请求都会到子系统。中介者模式,需要有一个中心,由中心协调同事类。

设计模式混编

新模式

规格模式

LINQ

Mybatis 中Criteria

对象池模式

黑板模式

mq,发布/订阅

附录

彩图

23-1

23-2

23-3

23-4


http://chatgpt.dhexx.cn/article/iPJFKrfQ.shtml

相关文章

《设计模式之禅》(第2版)

第一部分 大旗不挥 谁敢冲锋 —— 6大设计原则全新解读 第1章 单一职责原则 单一职责原则,Single Responsibility Principle,简称SRP,有且只有一个原因引起类/接口的变更;即一个接口/类只有一个职责,只负责一件事…

设计模式之禅《一》 大旗不挥,谁敢冲锋 ——6大设计原则

设计模式之禅《一》大旗不挥,谁敢冲锋 ——6大设计原则 《一》 六大原则 一:单一职责原则 1、单一职责原则最难划分的就是职责 2、有两个可以变化的原因放到了一个接口中,这就为以后的变化带来了风险。 3、对于单一职责原则,…

设计模式之禅(六大设计原则)

1.单一职责原则(Single Responsibility Principle) 也就是职责划分要明确,单一职责原则提出了一个编写程序的标准,用“职责”或者“变化原因”来衡量接口或者类设计的是否优良,但是“职责”或者“变化原因”都是不可度量的,因项目…

什么是ASCII码

ASCII码英文全称America Standard Code for Information Interchange,中文意思:美国信息交换标准码。它已被国际标准化组织(ISO)定为国际标准,称为ISO 646标准。适用于所有拉丁文字字母,ASCII码有7位码和8位…

最全ASCii 码表和说明

A的ASCII码是65,a的ASCII码是97。 ASCII码表中,小写字母排在大写字母的后面,一个字母的大小写数值相差32,一般知道大写字母的ASCII码数值,其对应的小写字母的ASCII码数值就算出来了,是大写字母的ASCII码数…

ASCII码

字符编码即ASCII码(American Standard Code for Information Interchange,美国信息交换标准码,国际通用的计算机内的字符数字的二进制编码),它是7位二进制编码,总共有128个符号,包括英文26个大写字母&#…

什么叫ASCII码

一个字符A,以 字符和整型都可以输出。因为字符A也是以二进制存储,这个二进制对应一个整数 那究竟什么是ASCII码? ASCII不是一个值,而是一种规定。 ASCII规定了不同字符是使用哪个整数值表示 它规定: A --65 B --…

关于ASCII码的转换

目录 ASCII码表ASCII码与字符之间的转换 ASCII码表 ASCII码与字符之间的转换 python中chr()和ord()两个函数可以实现ASCII码与字符之间的转换, 两者之间的关系 转换举例 stringbsuahisas num_list[ord(i) for i in string] str_list[chr(i) for i in num_list] p…

ASCII码介绍

ASCII码 概念 ASCII(American Standard Code for Information Interchange)的缩写(美国标准信息交换代码),已被国际标准化组织ISO采纳,作为国际通用的信息交换标准代码。 诞生背景 计算机对数据的识别、运算和存储都建立在二进制…

ASCII编码

ASCII编码 ASCII编码的概念对控制字符的解释详细说明 ASCII编码的概念 计算机是以二进制的形式来存储数据的,它只认识 0 和 1 两个数字,我们在屏幕上看到的文字,在存储之前都被转换成了二进制(0和1序列),在…

ascii码a和A为什么差32而不是26

ascii码a和A为什么差32而不是26? A的ASCII码是65,a的ASCII码是97; ASCII码表中,一个字母的大小写数值相差32,一般知道大写字母的ASCII码数值,其对应的小写字母的ASCII码数值就算出来了,是大写字…

ASCII码详解

ASCII简介 ASCII 码使用指定的 7 位或 8 位二进制数组合来表示 128 或 256 种可能的字符。标准 ASCII 码也叫基础ASCII码,使用 7 位二进制数来表示所有的大写和小写字母,数字 0 到 9、标点符号, 以及在美式英语中使用的特殊控制字符。其中&a…

a到z的ascii码值是多少_a和A对应的ASCII码数值分别是多少啊?

展开全部 A的ASCII码是65,a的ASCII码是97。 ASCII码表中,小写字母32313133353236313431303231363533e78988e69d8331333366303066排在大写字母的后面,一个字母的大小写数值相差32,一般知道大写字母的ASCII码数值,其对应…

输出ASCII码

输出字符的ASCII码 从键盘输入一个字符&#xff0c;按规定格式输出这个字符及它的ASCII码。例如&#xff1a; 输入 A 输出 “The ASCII of A is 65”.//输出的数值在双引号以内// 代码&#xff1a; ​ #include <stdio.h>int main() {char a;scanf("…

ascii码中的A的代码是什么?

ASCII&#xff08;American Standard Code for Information Interchange&#xff0c;美国标准信息交换代码&#xff09;是基于拉丁字母的一套电脑编码系统&#xff0c;主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统&#xff0c;并等同于国际标准ISO/IEC…

system函数阻塞问题

system()函数是阻塞方式进行的&#xff0c;他会新建一个进程! system代码执行完毕才继续执行&#xff01; 注意一点&#xff0c;如下的命令&#xff1a; #include <bits/stdc.h> #include <windows.h> using namespace std; int main() {std::cout << "…

Linux system函数的执行命令并获取状态

在linux中&#xff0c;可以通过调用system函数执行linux命令&#xff0c;但是如何获取执行命令的结果状态呢&#xff0c;也就是是否执行成功。 #include <stdio.h> #include <stdlib.h>int main() {int ret -1;ret system("cat /proc/mounts | grep sda"…

system函数常见用法

system函数 1.用来执行windows常用命令 我们知道 C语言是没有自己的窗口的&#xff0c;比如我们用printf函数在黑框上输出Hello World是其实是调用了windows的DOS交互窗口。 我们在C语言程序中用system可以给操作系统发送指定&#xff0c;其作用与直接在DOS窗口发送指令进行交…

system函数的总结

system函数的总结 2014-10-30 20:22 1216人阅读 评论(2) 收藏 举报 分类&#xff1a; 系统编程&#xff08;17&#xff09; 最近在看APUE第10章中关于system函数的POSIX.1的实现。关于POSIX.1要求system函数忽略SIGINT和SIGQUIT&#xff0c;并且阻塞信号SIGCHLD的论述&…

c/c++中system函数

原文地址&#xff1a;http://www.cnblogs.com/tianzeng/p/9550379.html 在windows下的system函数中命令可以不区别大小写&#xff01; 函数名&#xff1a; system 功 能&#xff1a; 发出一个DOS命令 用 法&#xff1a; #include <stdlib.h>int system(char *command…