【设计模式深度剖析】【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.…...
GitHub Trending 每日精选 - 2026-03-27
GitHub Trending 每日精选 - 2026-03-27 📈 今日概览 今天是 2026-03-27,GitHub Trending 榜单上有哪些值得关注的开源项目?注:此博客为自动化生成,系统会在每日运行时获取最新 Trending 数据并填充具体项目信息。&…...
Python AI 用例工具部署踩坑实录:Docker镜像体积暴增300%、GPU显存泄漏、模型热加载失败的5个根因与秒级修复方案
第一章:Python AI 用例工具部署的典型失败图谱在真实生产环境中,Python AI 工具链(如 LangChain、LlamaIndex、FastAPI 封装的推理服务)的部署失败往往并非源于模型能力缺陷,而是由基础设施、依赖冲突与配置漂移引发的…...
开源项目 Git 贡献全流程拆解:从入门到精通
好的,这是一篇关于开源项目 Git 贡献全流程拆解的技术文章大纲:开源项目 Git 贡献全流程拆解:从入门到精通引言开源精神与协作的重要性。Git 作为分布式版本控制系统在开源世界的核心地位。明确目标:清晰、完整地拆解向开源项目贡…...
Swift-All镜像入门:手把手教你快速部署,无需配置轻松上手
Swift-All镜像入门:手把手教你快速部署,无需配置轻松上手 想体验600大模型和300多模态模型的强大能力,却被复杂的安装配置劝退?Swift-All镜像就是为你准备的"开箱即用"解决方案。本文将带你从零开始,一步步…...
Realistic Vision V5.1 虚拟摄影棚实战:利用GitHub管理自定义模型与脚本
Realistic Vision V5.1 虚拟摄影棚实战:利用GitHub管理自定义模型与脚本 你是不是也遇到过这样的烦恼?好不容易在本地电脑上,用Realistic Vision V5.1模型调出了一套完美的参数组合,生成的人像照片质感堪比专业影棚。结果换台电脑…...
从VGG到ResNet:为什么说‘残差块’是深度学习模型‘卷’层数的救命稻草?
从VGG到ResNet:残差连接如何重塑深度神经网络的设计哲学 2014年ImageNet竞赛上,VGGNet凭借其规整的3x3卷积堆叠结构一举夺魁,将图像识别准确率提升到新高度。正当整个计算机视觉领域沉浸在"更深就一定更好"的乐观情绪中时ÿ…...
【AI工程化硬核考点】:FastAPI 2.0 + async/await + StreamingResponse三重协程调度机制精讲
第一章:FastAPI 2.0 异步 AI 流式响应 面试题汇总FastAPI 2.0 原生强化了对异步流式响应(StreamingResponse)的支持,尤其适用于大语言模型(LLM)推理、实时日志推送、AI 生成内容分块返回等场景。面试官常聚…...
OpenClaw+GLM-4.7-Flash学习助手:自动整理课程笔记与生成复习题
OpenClawGLM-4.7-Flash学习助手:自动整理课程笔记与生成复习题 1. 为什么需要自动化学习助手? 去年备考研究生时,我每天要处理3-4小时的课程视频。最痛苦的不是听课本身,而是课后整理:手动截取关键片段、转录字幕、标…...
RK3128安卓5.1系统APK签名全流程:从signapk.jar到platform.pk8的保姆级教程
RK3128安卓5.1系统APK签名实战指南:工具获取与问题排查全解析 在嵌入式Android开发领域,RK3128芯片因其性价比优势被广泛应用于各类智能终端设备。当开发者需要为这类设备定制系统应用或预装APK时,掌握正确的签名方法至关重要。不同于普通And…...
大数据毕业设计 hadoop+spark+kafka+hive动漫推荐系统 动漫数据分析 可视化 漫画推荐
1、项目介绍 技术栈: Python语言、Django框架、SQLite数据库、Echarts可视化 、HTML、基于物品协同过滤推荐算法 (1)首页------不同类 型的动漫数据 (2)动漫类型饼图 (3)动漫收藏排名和不同国家…...
