【设计模式深度剖析】【B】【结构型】【对比】| 主要区别包装的不同
👈️上一篇:享元模式
回 顾:结构型设计模式
1.代理模式👈️
2.装饰器模式👈️
3.适配器模式👈️
4.组合模式👈️
5.桥接模式👈️
6.外观模式👈️
7.享元模式👈️
设计模式-专栏👈️
文章目录
- 结构型模式对比
- 概览
- 代理模式
- 明星接口IStar:上层抽象主题
- 明星类Star:主题类,实现上层抽象
- 经纪人代理人Proxy
- 测试
 
- 装饰模式
- 明星接口IStar:上层抽象构件
- 明星类Star的代码
- 替身演员Standin(被装饰类角色)
- 抽象装饰类Decorator
- 具体装饰类ConcreteDecorator
- 测试类:演员演戏,以及被装饰的替身演戏
 
- 适配器模式
- 明星接口IStar:目标(Target)角色
- 适配器的代码Adapter:将替身演员(源角色) 适配到 明星接口(目标接口)
- 替身演员Standin:源(Adaptee)角色
- 演员接口IActor:替身演员(源角色)上层抽象接口
- 测试类:明星自己演戏 && 适配的替身演员演戏
 
- 参考
结构型模式对比
结构类模式包括:代理模式、装饰模式、适配器(变压器)模式、组合模式、桥梁模式、门面(外观)模式、享元模式,它们都是通过组合类或对象产生更复杂的结构以适应更高层次的逻辑需求
其中:
-  组合模式、桥梁模式、外观模式、享元模式有各自显著特点,易区分 -  组合模式(Composite Pattern)注重形成上下层次间的“树形结构”。 
-  桥接模式(Bridge Pattern)主要注重的是解耦抽象与实现,使得它们可以独立地变化。 通过引入抽象层与实现层的概念,并利用组合关系来解耦抽象与实现。它使得抽象层与实现层可以独立地变化,提高了系统的灵活性和扩展性。在需要频繁地修改或扩展系统时,桥梁模式是一种非常有效的设计模式。 
-  外观模式(Facade Pattern)提供了一种统一的接口,用于简化对复杂子系统的访问,隐藏子系统的细节,使得客户端只需与外观对象交互,而无需与子系统中的多个对象交互。 
-  享元模式(Flyweight Pattern)是池技术实现的重要方式,系统内有此对象就返回该对象的引用,否则创建该对象 
 
-  
-  主要对代理模式(Proxy Pattern)、装饰模式(Decorator Pattern)和适配器模式(Adapter Pattern)进行对比,这三个模式有一个共同点,它们都能够对类进行“包装”(wrapping ),但它们之间的主要区别如下 - 装饰模式是代理模式的一个特殊应用,虽然它们都具有相同的接口,但装饰模式是对类的功能进行加强或减弱,重点是类的功能变化;而代理模式着重代理过程的控制。
- 装饰模式和适配器模式都能对类进行“包装”,但装饰模式包装的是同一家族(相同接口或父类)的对象,而适配器模式可以修饰不同接口的对象,主要是将非本家族的对象伪装成同一家族对象。 - [记]:
- 【代理模式】中,客户端需要创建被代理对象(主题类),创建代理类并注入主题类,从而持有被代理对象,进行附加业务逻辑处理; - 代理类通过组合方式组合上层抽象接口到类中,构造函数实际上用于注入主题类,从而使得代理类持有主题类;
 
- 【装饰模式】装饰“本家”,【适配器模式】将不是“本家”的类伪装成“本家”的,达到适配效果。
- 具体装饰类构造注入被装饰类,调用抽象装饰父类构造器,传给抽象父类被装饰类。从而,使得抽象装饰父类持有被装饰对象;
- 【适配逻辑】:定义适配器类继承源(Adaptee)角色(Standin类)实现目标(Target)接口(IStar接口);从而使得适配器类中将源角色中的方法“移花接木”到实现的目标接口的方法中(用得到super调用源角色方法)
 
 
概览
- 代理模式 - 通过经纪人安排明星是否接拍戏、拍广告代言的示例来说明
 
- 装饰模式 - 通过替身演员被装饰“看上去就像演员本身”去演戏来说明
 
- 适配器模式 - 通过对替身演员类进行适配到明星接口
 
代理模式
现在很多明星都有经纪人,所有的业务都是通过经纪人进行联络和活动,这是典型的代理模式。
下述内容用于实现任务描述:使用代理模式演示经纪人对明星的代理活动
经纪人代理明星,安排是否拍戏,是否广告代言,类图如下:

明星接口IStar:上层抽象主题
public interface IStar {// 明星演戏public abstract void action();// 明星广告代言public abstract void adver();
}
明星类Star:主题类,实现上层抽象
public class Star implements IStar {// 姓名private String name;// 构造函数public Star(String name) {this.name = name;}@Overridepublic void action() {System.out.println(this.name + "在演戏中");}@Overridepublic void adver() {System.out.println(this.name + "在做广告代言");}
}
经纪人代理人Proxy
代理角色类,实现上层抽象,同时将上层抽象(实际注入主题类即被代理类)组合(是一种强聚合关系,代表部分与整体关系)到本类中
public class Proxy implements IStar {private IStar star;// 构造注入上层抽象类型的对象public Proxy(IStar star) {this.star = star;}// 代理明星演戏@Overridepublic void action() {Random random = new Random();if (random.nextBoolean()) {System.out.println("经纪人同意安排明星演戏");this.star.action();} else {System.out.println("明星档期已满,不能安排演戏");}}@Overridepublic void adver() {Random random = new Random();if (random.nextBoolean()) {System.out.println("经纪人同意安排明星广告代言");this.star.adver();} else {System.out.println("明星档期已满,不能安排广告代言");}}
}
测试
经纪人代理明星,安排是否拍戏,是否广告代言
public class StarProxyTest {public static void main(String[] args) {// 定义一个明星IStar star = new Star("范冰冰");// 定义一个经纪人Proxy proxy = new Proxy(star);// 代理安排演戏否proxy.action();// 代理安排广告代言否proxy.adver();}
}------
经纪人同意安排明星演戏
范冰冰在演戏中
明星档期已满,不能安排广告代言
装饰模式
现在很多明星在演戏时都使用替身,其实就是将替身进行修饰,使观众以为是明星自己演戏。
下述内容用于实现任务描述:使用装饰模式将替身演员修饰成明星.
替身演员被装饰达到去替代演员演戏的效果,类图如下:

明星接口IStar:上层抽象构件
将主题类方法进行抽象,用于被装饰类也实现此接口,从而被具体装饰类所装饰
public interface IStar {// 明星演戏public abstract void action(String context);
}
明星类Star的代码
public class Star implements IStar {@Overridepublic void action(String context) {System.out.println("------------");System.out.println("明星亲自演戏" + context);System.out.println("------------");}
}
替身演员Standin(被装饰类角色)
public class Standin implements IStar {@Overridepublic void action(String context) {System.out.println("替身演戏" + context);}
}
抽象装饰类Decorator
public abstract class Decorator implements IStar {private IStar star;protected Decorator(IStar star) {this.star = star;}@Overridepublic void action(String context) {this.star.action(context);}
}
具体装饰类ConcreteDecorator
public class ConcreteDecorator extends Decorator {// 构造注入被装饰类,调用抽象装饰父类构造器,传给抽象父类被装饰类。// 从而,使得抽象装饰父类持有被装饰对象public ConcreteDecorator(IStar star) {super(star);}@Overridepublic void action(String context) {System.out.println("------------");//添加具体修饰逻辑System.out.println("进行化妆、造型,让人看上去像明星");super.action(context);System.out.println("------------");}
}
测试类:演员演戏,以及被装饰的替身演戏
public class DecoratorTest {public static void main(String[] args) {// 明星自己演戏IStar star = new Star();star.action("表演10分钟");//在找替身演员替演IStar standin = new Standin();standin = new ConcreteDecorator(standin);standin.action("表演5分钟");}
}------------
明星亲自演戏表演10分钟
------------
------------
进行化妆、造型,让人看上去像明星
替身演戏表演5分钟
------------
[注意]:Star和Standin都继承IStar接口,Decorator装饰类是对同一家族的类进行修饰。
适配器模式
下述内容用于实现任务描述:使用适配器模式演示替身演员和明星
此示例适配器角色用于把替身演员类适配到明星上层抽象接口。类图如下:

适配逻辑:定义适配器类继承源(Adaptee)角色(Standin类)实现目标(Target)接口(IStar接口);从而使得适配器类中将源角色中的方法“移花接木”到实现的目标接口的方法中(用得到super调用源角色方法)
明星接口IStar:目标(Target)角色
public interface IStar {// 明星演戏public abstract void action(String context);
}
明星类Star的代码
public class Star implements IStar {@Overridepublic void action(String context) {System.out.println("明星亲自演戏" + context);}
}
适配器的代码Adapter:将替身演员(源角色) 适配到 明星接口(目标接口)
public class Adapter extends Standin implements IStar {@Overridepublic void action(String context) {// 让替身演员演戏super.play(context);}
}
替身演员Standin:源(Adaptee)角色
public class Standin implements IActor {@Overridepublic void play(String context) {// 替身演员演戏System.out.println("替身演戏" + context);}
}
演员接口IActor:替身演员(源角色)上层抽象接口
public interface IActor {// 演员演戏public abstract void play(String context);
}
测试类:明星自己演戏 && 适配的替身演员演戏
public class TestAdapter {public static void main(String[] args) {IStar star = new Star();star.action("表演10分钟");// 再找替身演员替演star = new Adapter();star.action("表演5分钟");}
}------明星亲自演戏表演10分钟
替身演戏表演5分钟
[注意] Star和Standin分别继承不同的接口,Adapter适配器可以对不同类型的类进行包装。
参考
《设计模式(Java版)韩敬海主编》
👈️上一篇:享元模式
回 顾:结构型设计模式
1.代理模式👈️
2.装饰器模式👈️
3.适配器模式👈️
4.组合模式👈️
5.桥接模式👈️
6.外观模式👈️
7.享元模式👈️
设计模式-专栏👈️
相关文章:
 
【设计模式深度剖析】【B】【结构型】【对比】| 主要区别包装的不同
👈️上一篇:享元模式 回 顾:结构型设计模式 1.代理模式👈️ 2.装饰器模式👈️ 3.适配器模式👈️ 4.组合模式👈️ 5.桥接模式👈️ 6.外观模式👈️ 7.享元模式&#x…...
 
信息学奥赛初赛天天练-17-阅读理解-浮点数精准输出与海伦公式的巧妙应用
PDF文档公众号回复关键字:20240531 1 2023 CSP-J 阅读程序1 阅读程序(程序输入不超过数组成字符串定义的范围:判断题正确填√,错误填;除特殊说明外,判断题1.5分,选择题3分,共计40分࿰…...
mysql - 为什么MySQL不建议使用NULL作为列默认值?
为什么MySQL不建议使用NULL作为列默认值? InnoDB有4中行格式: Redundant : 非紧凑格式,5.0 版本之前用的行格式,目前很少使用,Compact : 紧凑格式,5.1 版本之后默认行格式,可以存储更多的数据Dynamic , Compressed : 和Compact类似,5.7 版本之后默认使…...
 
数据分析案例-在线食品订单数据可视化分析与建模分类
🤵♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞Ǵ…...
构建LangChain应用程序的示例代码:2、使用LangChain库实现的AutoGPT示例:查找马拉松获胜成绩
AutoGPT 示例:查找马拉松获胜成绩 实现 https://github.com/Significant-Gravitas/Auto-GPT,使用LangChain基础组件(大型语言模型(LLMs)、提示模板(PromptTemplates)、向量存储(VectorStores)、嵌入(Embeddings)、工具(Tools))。…...
代码随想录算法训练营第三十四 |● 1005.K次取反后最大化的数组和 ● 134. 加油站 ● 135. 分发糖果
今天的解析写在了代码注释中 1005.K次取反后最大化的数组和 讲解链接:https://programmercarl.com/1005.K%E6%AC%A1%E5%8F%96%E5%8F%8D%E5%90%8E%E6%9C%80%E5%A4%A7%E5%8C%96%E7%9A%84%E6%95%B0%E7%BB%84%E5%92%8C.html class Solution { public:static bool cmp(i…...
GB-T 43206-2023 信息安全技术 信息系统密码应用测评要求
GB-T 43206-2023 信息安全技术 信息系统密码应用测评要求 编写背景 随着信息技术的飞速发展,信息系统在社会经济活动中扮演着越来越重要的角色。信息安全问题也随之成为社会关注的焦点。GB-T 43206-2023《信息安全技术 信息系统密码应用测评要求》是针对信息系统中…...
线程进阶-1 线程池
一.说一下线程池的执行原理 1.线程池的七大核心参数 (1)int corePoolSize:核心线程数。默认情况下核心线程会一直存活,当设置allowCoreThreadTimeout为true时,核心线程也会被超时回收。 (2)i…...
 
LabVIEW中PID控制器系统的噪声与扰动抑制策略
在LabVIEW中处理PID控制器系统中的噪声和外部扰动,需要从信号处理、控制算法优化、硬件滤波和系统设计四个角度入手。采用滤波技术、调节PID参数、增加前馈控制和实施硬件滤波器等方法,可以有效减少噪声和扰动对系统性能的影响,提高控制系统的…...
 
JavaWeb笔记整理+图解——Listener监听器
欢迎大家来到这一篇章——Listener监听器 监听器和过滤器都是JavaWeb服务器三大组件(Servlet、监听器、过滤器)之一,他们对于Web开发起到了不可缺少的作用。 ps:想要补充Java知识的同学们可以移步我已经完结的JavaSE笔记&#x…...
 
AIGC智能办公实战 课程,祝你事业新高度
在数字化时代,人工智能(AI)已经渗透到我们生活的方方面面,从智能家居到自动驾驶,从医疗诊断到金融分析,AI助手正在改变我们的工作方式和生活质量。那么,你是否想过自己也能从零开始,…...
专科生听劝 这种情况你就不要专转本了
罗翔老师说过,读书学习主要作用是提高人的下限 我们能掌握的只有学习,以确保学历不会太差再去等机遇让自己活得更好 大部分情况来说,专科生努力去专转本挺好的提升自己准没错,我当年也是一心这样想的,但今天不得不说点…...
 
MySQL增删查改初阶
目录 一,数据库操作 1.关键字 show 显示当前数据库有哪些:show databases; 2.创建数据库 3.选中数据库 4.删除数据库 二,表的操作,在选中数据库的基础之上 1.查看表的结构 2.创建表 3.查看当前选中的数据库中…...
IService 接口中定义的常用方法
文心一言生成 以下是一些 IService 接口中定义的常用方法(以你提供的 UserSQL 类为例,该类继承自 ServiceImpl,因此也会拥有这些方法): 插入(新增) boolean save(T entity): 插入一条记录&…...
 
api网关kong对高频的慢接口进行熔断
一、背景 在生产环境,后端服务的接口响应非常慢,是因为数据库未创建索引导致。 如果QPS低的时候,因为后端服务有6个高配置的节点,虽然接口慢,还未影响到服务的正常运行。 但是,当QPS很高的时候,…...
python作业:实现一个任务列表管理系统,使用到python类、对象、循环等知识
实现一个简单的任务列表管理系统,可以用于python学习的作业或者练习。系统的功能包括: 用户可以添加任务、查看任务列表、标记任务为已完成,以及删除任务。 代码如下: class Task: def __init__(self, name, completedFalse):…...
大宋咨询(深圳产品价格调查)如何开展电子商品渠道价格监测
开展电子商品渠道价格监测是当今电商时代的重要任务之一。随着电子商务的迅猛发展,电子商品的价格波动日益频繁,市场竞争也愈发激烈。为了解优化渠道管理策略,提升品牌竞争力,大宋咨询(深圳市场调查)受客户…...
 
py黑帽子学习笔记_web攻击
python网络库 py2的urllib2 py3好像把urllib2继承到了标准库urllib,直接用urllib就行,urllib2在urllib里都有对应的接口 py3的urllib get请求 post请求,和get不同的是,先把post请求数据和请求封装到request对象,再…...
 
MVC、MVP 和 MVVM 架构总结
MVC、MVP 和 MVVM 是常见的软件架构模式,主要用于组织应用程序的结构,特别是在用户界面和业务逻辑之间进行分离。以下是对它们的详细解释,包括它们的差异、优缺点。 MVC(Model-View-Controller) 结构 Model…...
 
C++ vector的使用和简单模拟实现(超级详细!!!)
目录 前言 1.STL是什么 2.vector使用 2.1 vector简介 2.2 常用接口函数 1. 构造函数 2.operator[ ]和size,push_back 3. 用迭代器进行访问和修改 4. 范围for遍历 5.修改类型函数 pop_back find insert erase 6. 容量相关函数capacity resize reserve 3.…...
 
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
 
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
 
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
 
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
 
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
 
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
