设计模式学习笔记——结构型模式
文章目录
- 适配器模式 Adapter
- 适用场景
- UML
- 桥接模式 Bridge
- 适用场景
- UML
- 组合模式 Composite
- 装饰模式 Decorator
- 外观模式 Facade
- 享元模式 Flyweight
- 代理模式 Proxy
适配器模式 Adapter
适用场景
- 希望使用某个类, 但是其接口与其他代码不兼容时, 可以使用适配器类。
UML
结构一:
适配器实现了其中一个对象的接口, 并对另一个对象进行封装。
结构二:
有些编程语言支持多继承,比如C++。适配器同时继承两个对象的接口,适配功能在重写的方法中完成。 最后生成的适配器可替代已有的客户端类进行使用。
eg:
Adapter::method() {specialData = convertToServiceFormat(data);return serviceMethod(specialData);
}
通过上面的分析可以看出来,适配器模式,是将某个对象封装到Adapter的内部,然后为被封装对象提供不同的接口。
桥接模式 Bridge
适用场景
- 如果你希望在几个独立维度上扩展一个类, 可使用该模式。
- 如果你想要拆分或重组一个具有多重功能的庞杂类 (例如能与多个数据库服务器进行交互的类), 可以使用桥接模式。
- 如果你需要在运行时切换不同实现方法, 可使用桥接模式。
案例:
一个Shape类,派生出了Circle类和Square类。你希望对这样的类层次结构进行扩展以使其包含颜色, 所以你打算创建名为 红色Red和 蓝色Blue的形状子类。由于你已有两个子类, 所以总共需要创建四个类才能覆盖所有组合, 那就得派生出红色Circle+红色Square+蓝色Circle+蓝色Square。如果后续你想新增一个三角形形状,你需要增加两个子类,即红色三角形和蓝色三角形,再之后如果你想增加一个颜色,你需要增加三个子类。子类的个数会呈指数增长。
UML
- 抽象部分
Abstraction提供了高层控制逻辑,实际工作依赖于底层的实现Implementation。比如GUI程序的底层实际是调用了操作系统的API,此处的抽象部分就相当于GUI程序的主逻辑,底层的实现部分就相当于操作系统的API。
Abstraction::feature1(){...i.method1();...
}
Abstraction::feature2(){...i.method2();i.method3();
}
- 实现部分
Implementation声明了通用的接口,用于为高层提供功能。 - 具体实现
Concrete Implementation里包括了特定平台的代码 - 精确抽象
Refined Abstraction提供控制逻辑的变体(featureN),与父类一样,也是依赖实现的接口与实现交互。 - 客户端
Client一般负责将某个抽象和某个实现连接起来,然后调用抽象的方法。abstraction.feature1();
像这样将高层抽象和具体实现分离开,两个部分可以分别演进而不会对另一方产生影响。至于为什么叫Bridge模式,大概主要是因为二者之间通过聚合关系关联到一起,这个聚合关系,就像是二者沟通的桥梁。
组合模式 Composite
将对象集合封装到Composite内部,为单元素和集合元素提供相同的接口,便于处理树形的逻辑结构。
装饰模式 Decorator
将对象封装到Decorator内部,为对象提供一个增强的接口。
外观模式 Facade
将子系统细节封装到Facade内部,为子系统提供一个简化的接口。
享元模式 Flyweight
将对象中不易变的大成员提取出来单独存储,而在对象内部只存储一个指向大成员的指针或者引用,以达到缩减内存占用的目的。
代理模式 Proxy
将对象封装到Proxy内部,为对象提供一个和对象相同的接口。
相关文章:
设计模式学习笔记——结构型模式
文章目录 适配器模式 Adapter适用场景UML 桥接模式 Bridge适用场景UML 组合模式 Composite装饰模式 Decorator外观模式 Facade享元模式 Flyweight代理模式 Proxy 适配器模式 Adapter 适用场景 希望使用某个类, 但是其接口与其他代码不兼容时, 可以使用…...
WEB攻防-通用漏洞_文件上传_黑白盒审计流程
目录 前置知识点 Finecms-CMS文件上传 编辑 Cuppa-Cms文件上传 Metinfo-CMS 文件上传 前置知识点 思路: 黑盒就是寻找一切存在文件上传的功能应用 1 、个人用户中心是否存在文件上传功能 2 、后台管理系统是否存在文件上传功能 3 、字典目录扫描探针文件上传构…...
RabbitMQ基本介绍及简单上手
(一)什么是MQ MQ(message queue)本质上是队列,满足先入先出,只不过队列中存放的内容是消息而已,那什么是消息呢? 消息可以是字符串,json也可以是一些复杂对象 我们应用场…...
服务器证书不受信任是什么问题?
用户在访问某些网站时,可能会遇到“服务器证书不受信任”的警告。这一问题不仅影响用户的浏览体验,更可能对网站的信誉和安全性产生深远影响。那么服务器证书不受信任是什么问题呢? 服务器证书的基本概念 服务器证书是由证书颁发机构(CA)签…...
spring mvc源码学习笔记之十
前面的文章介绍了用 WebApplicationInitializer 或者 AbstractAnnotationConfigDispatcherServletInitializer 来代替 web.xml 。 我们学 java web 的时候就知道,servlet 容器会自动加载 web.xml。 那么,疑问就来了,WebApplicationInitialize…...
Ubuntu 下载安装 elasticsearch7.17.9
参考 https://blog.csdn.net/qq_26039331/article/details/115024218 https://blog.csdn.net/mengo1234/article/details/104989382 过程 来到 Es 的版本发布列表页面:https://www.elastic.co/downloads/past-releases#elasticsearch 根据自己的系统以及要安装的…...
Qt笔记:网络编程Tcp
一、铺垫 1.以下只是告诉诸位怎样去构建服务器与客户端;客户端这样构建肯定没问题;但是服务端不可能这样写,因为他是布置在Linux上的,纯数据类处理服务器,根本不可能用Qt写;这在Qt的http类中就表明了&…...
C++单例模式跨DLL调用问题梳理
问题案例: 假设有这样一个单例模式的代码 //test.h header class Test { public:static Test &instance() {static Test ins;return ins;}void foo(); };void testFoo();//test.cpp source #include "test.h"void Test::foo() {printf("%p\n&q…...
oracle闪回版本查询
闪回版本查询(Flashback Versions Query)是Oracle数据库提供的一种功能,允许用户查看某个表在特定时间范围内的所有版本。这对于审计和调试数据修改问题非常有用。通过闪回版本查询,你可以了解表中的数据在某个时间段内的变化历史…...
C#用winform窗口程序操作服务+不显示Form窗体,只显示右下角托盘图标+开机时自启动程序【附带项目地址】
服务的文章在:https://blog.csdn.net/weixin_43768573/article/details/144957941 一、用winform窗口程序操作服务 1、点击“创建新项目”,选择“Windows 服务(.NET Framework)” 2、给项目命名 3、右击项目->添加->新建项,选择“应用程序清单文件(仅限Windo…...
UOS系统和windows系统wps文档显示差异问题解决
最近在使用UOS系统的过程中,发现了一个很有意思的现象。就是在UOS系统上编辑的文档,发到windows系统上,会出现两个文档显示差异很大的情况,文档都是使用一样的wps软件打开的。到底是什么原因导致这种现象的呢?该如何解…...
JS中函数基础知识之查漏补缺(写给小白的学习笔记)
函数 函数是ECMAScript中 最有意思的部分之一, 主要是因为函数实际上是对象.-- 每个函数 都是Function类型的实例,Function也有属性和方法. 因为函数是对象,所以函数名就是指向函数对象的指针. 常用的定义函数的语法: ①函数声明 ②函数表达式 ③箭头函数 function sum (n…...
蓝桥杯训练
1对于一个字母矩阵,我们称矩阵中的一个递增序列是指在矩阵中找到两个字母,它们在同一行,同一列,或者在同一 45 度的斜线上,这两个字母从左向右看、或者从上向下看是递增的。 例如,如下矩阵中 LANN QIAO有…...
前端学习DAY33(外边距的折叠)
垂直外边距的重叠 在网页中相邻的垂直方向的外边距,会发生外边距的重叠 兄弟元素 兄弟元素之间的相邻外边距会取(绝对值)最大值,而不是取和,谁大取谁 特殊情况:如果相邻的外边距一正一负,则取两…...
asp.net core mvc的 ViewBag , ViewData , Module ,TempData
在 ASP.NET MVC 和 ASP.NET Core MVC 中,ViewBag 和 ViewData 是两种用于将数据从控制器传递到视图(View)的常用方法。它们都允许控制器将动态数据传递给视图,但它们的实现方式有所不同。关于 Module,它通常指的是某种…...
Linux驱动学习之第二个驱动程序(LED点亮关闭驱动程序-分层设计思想,使其能适应不同的板子-驱动程序模块为多个源文件怎么写Makefile)
目录 看这篇博文前请先掌握下面这些博文中的知识需要的PDF资料完整源代码board_fire_imx6ull-pro.c中的代码leddrv.c中的代码ledtest.c中的代码 程序设计思想和文件结构实现分层思想的具体方法概述具体实现分析定义结构体led_operations用来集合各个单板硬件层面操作LED的函数定…...
手写@EnableTransactionalManagement
定义一个注解,用于标注于方法上,标志着此方法是一个事务方法。 Target({ElementType.METHOD,ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) public interface MyTransaction {}定义一个开启事务功能的注解 Component Import(TransActionBean…...
【Vue】:解决动态更新 <video> 标签 src 属性后视频未刷新的问题
问题描述 在 Vue.js 项目,当尝试动态更新 <video> 标签的 <source> 元素 src 属性来切换视频时,遇到了一个问题:即使 src 属性已更改,浏览器仍显示旧视频。具体表现为用户选择新视频后,视频区域继续显示之…...
网络基础1 http1.0 1.1 http/2的演进史
http1.0 1.1 http/2的演进史😎 (连接复用 队头阻塞 服务器推送 2进制分帧) 概述 我们主要关注的是应用层 传输层 http协议发展历史 http的报文结构:起始行 Header Body http的典型特征 http存在的典型问题 Keep Alive机制 chun…...
Python 通过命令行在 unittest.TestCase 中运行单元测试
文章目录 unittest 模块简介编写单元测试在命令行中运行所有测试在命令行中运行单个测试使用装饰器跳过测试总结常用断言方法 unittest 模块简介 unittest是Python标准库中的一个模块,用于编写和运行单元测试。它提供了一个单元测试框架,使得编写测试用…...
Phi-4-Reasoning-Vision快速部署:CI/CD自动化测试流水线搭建
Phi-4-Reasoning-Vision快速部署:CI/CD自动化测试流水线搭建 1. 项目概述 Phi-4-Reasoning-Vision是基于微软Phi-4-reasoning-vision-15B多模态大模型开发的高性能推理工具,专为双卡4090环境优化。这个工具严格遵循官方SYSTEM PROMPT规范,支…...
Qwen3-32B-Chat镜像实战:OpenClaw自动化处理1000份PDF简历
Qwen3-32B-Chat镜像实战:OpenClaw自动化处理1000份PDF简历 1. 为什么选择这个技术组合 去年团队招聘季,我们收到了近千份PDF格式的简历。当手动处理到第37份时,我的眼睛已经开始抗议——重复性的信息提取、格式转换、关键词匹配消耗了太多精…...
TranslucentTB:Windows任务栏个性化的轻量高效解决方案
TranslucentTB:Windows任务栏个性化的轻量高效解决方案 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 在当今数字化办公与娱…...
px、em、rem、vw、vh、clamp 怎么选?
整理了一套单位使用规范,新手可以直接套用,不用再纠结怎么选,高效又避坑: /* 1. 根字号:设置rem基准,避免浏览器差异 */ html { font-size: 16px; }/* 2. 字体:rem(全局统一…...
OpenClaw语音交互:千问3.5-9B实现的自然语言控制
OpenClaw语音交互:千问3.5-9B实现的自然语言控制 1. 为什么需要语音交互的自动化助手 去年冬天的一个深夜,我正在赶制一份紧急报告。双手忙着整理数据,眼睛盯着屏幕,却突然需要打开另一个参考文档。那一刻我突然想:如…...
Qwen3-TTS-Tokenizer-12Hz部署避坑指南:from_pretrained路径详解
Qwen3-TTS-Tokenizer-12Hz部署避坑指南:from_pretrained路径详解 1. 引言:为什么你的from_pretrained总是报错 在部署Qwen3-TTS-Tokenizer-12Hz时,90%的报错都集中在from_pretrained这一步。你可能遇到过这些错误提示: "U…...
正则匹配实现验证
邮箱正则表达式匹配 使用正则表达式匹配163邮箱格式的字符串,要求用户名部分为4-20位的字母或数字,域名固定为163.com。 import re ret re.match("[a-zA-Z0-9]{4,20}163\.com", 字符串) if ret:print(ret.group()) else:print("匹配失败…...
Typora Markdown沉浸式写作:Phi-3-mini辅助内容创作与排版
Typora Markdown沉浸式写作:Phi-3-mini辅助内容创作与排版 1. 技术写作的新范式 技术写作正经历一场静默革命。传统写作流程中,作者需要同时处理内容创作、格式调整和逻辑校验三重任务,这种多任务切换不仅降低效率,还容易打断创…...
Cogito-V1-Preview-Llama-3B工具链:Keil5嵌入式开发中的文档查询助手
Cogito-V1-Preview-Llama-3B工具链:Keil5嵌入式开发中的文档查询助手 每次在Keil5里写STM32的代码,你是不是也经常遇到这种情况:想查某个外设的寄存器地址,得先最小化IDE,在一堆PDF手册里翻半天;想确认某个…...
GTE-Chinese-Large镜像免配置实战:从启动到API调用的全流程详细步骤
GTE-Chinese-Large镜像免配置实战:从启动到API调用的全流程详细步骤 1. 镜像概述与核心价值 GTE-Chinese-Large是阿里达摩院推出的专门针对中文场景优化的文本向量化模型。这个镜像最大的特点就是开箱即用——所有依赖环境、模型文件、Web界面都已经预先配置好&am…...
