【设计模式深度剖析】【B】【结构型】【对比】| 主要区别包装的不同

news2024/11/18 11:31:34

👈️上一篇:享元模式

回 顾:结构型设计模式

1.代理模式👈️

2.装饰器模式👈️

3.适配器模式👈️

4.组合模式👈️

5.桥接模式👈️

6.外观模式👈️

7.享元模式👈️

设计模式-专栏👈️

文章目录

  • 结构型模式对比
  • 概览
  • 代理模式
    • 明星接口IStar:上层抽象主题
    • 明星类Star:主题类,实现上层抽象
    • 经纪人代理人Proxy
    • 测试
  • 装饰模式
    • 明星接口IStar:上层抽象构件
    • 明星类Star的代码
    • 替身演员Standin(被装饰类角色)
    • 抽象装饰类Decorator
    • 具体装饰类ConcreteDecorator
    • 测试类:演员演戏,以及被装饰的替身演戏
  • 适配器模式
    • 明星接口IStar:目标(Target)角色
    • 适配器的代码Adapter:将替身演员(源角色) 适配到 明星接口(目标接口)
    • 替身演员Standin:源(Adaptee)角色
    • 演员接口IActor:替身演员(源角色)上层抽象接口
    • 测试类:明星自己演戏 && 适配的替身演员演戏
  • 参考

结构型模式对比

结构类模式包括:代理模式装饰模式适配器(变压器)模式组合模式桥梁模式门面(外观)模式享元模式,它们都是通过组合类或对象产生更复杂的结构以适应更高层次的逻辑需求

其中:

  1. 组合模式、桥梁模式、外观模式、享元模式有各自显著特点,易区分

    • 组合模式(Composite Pattern)注重形成上下层次间的“树形结构”

    • 桥接模式(Bridge Pattern)主要注重的是解耦抽象与实现,使得它们可以独立地变化。

      通过引入抽象层与实现层的概念,并利用组合关系来解耦抽象与实现。它使得抽象层与实现层可以独立地变化,提高了系统的灵活性和扩展性。在需要频繁地修改或扩展系统时,桥梁模式是一种非常有效的设计模式。

    • 外观模式(Facade Pattern)提供了一种统一的接口,用于简化对复杂子系统的访问,隐藏子系统的细节,使得客户端只需与外观对象交互,而无需与子系统中的多个对象交互。

    • 享元模式(Flyweight Pattern)是池技术实现的重要方式,系统内有此对象就返回该对象的引用,否则创建该对象

  2. 主要对代理模式(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;
    }

    @Override
    public void action() {
        System.out.println(this.name + "在演戏中");
    }

    @Override
    public void adver() {
        System.out.println(this.name + "在做广告代言");
    }
}

经纪人代理人Proxy

代理角色类,实现上层抽象,同时将上层抽象(实际注入主题类即被代理类)组合(是一种强聚合关系,代表部分与整体关系)到本类中

public class Proxy implements IStar {
    private IStar star;

    // 构造注入上层抽象类型的对象
    public Proxy(IStar star) {
        this.star = star;
    }

    // 代理明星演戏
    @Override
    public void action() {
        Random random = new Random();
        if (random.nextBoolean()) {
            System.out.println("经纪人同意安排明星演戏");
            this.star.action();
        } else {
            System.out.println("明星档期已满,不能安排演戏");
        }
    }

    @Override
    public 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 {

    @Override
    public void action(String context) {
        System.out.println("------------");
        System.out.println("明星亲自演戏" + context);
        System.out.println("------------");
    }
}

替身演员Standin(被装饰类角色)

public class Standin implements IStar {

    @Override
    public 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;
    }

    @Override
    public void action(String context) {
        this.star.action(context);
    }
}

具体装饰类ConcreteDecorator

public class ConcreteDecorator extends Decorator {
    // 构造注入被装饰类,调用抽象装饰父类构造器,传给抽象父类被装饰类。
    // 从而,使得抽象装饰父类持有被装饰对象
    public ConcreteDecorator(IStar star) {
        super(star);
    }

    @Override
    public 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 {

    @Override
    public void action(String context) {
        System.out.println("明星亲自演戏" + context);
    }
}

适配器的代码Adapter:将替身演员(源角色) 适配到 明星接口(目标接口)

public class Adapter extends Standin implements IStar {

    @Override
    public void action(String context) {
        // 让替身演员演戏
        super.play(context);
    }
}

替身演员Standin:源(Adaptee)角色

public class Standin implements IActor {

    @Override
    public 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.享元模式👈️

设计模式-专栏👈️

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1721120.html

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

相关文章

Java操作Excel文档进行读取和写入

目录 读出Excel文档 写入Excel文档 读出Excel文档 使用EasyExcel读取Excel文件: 需要在maven项目中导入EasyExcel依赖 <!-- EasyExcel依赖包 --> <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><v…

信号稳定,性能卓越!德思特礁鲨系列MiMo天线正式发布!

作者介绍 礁鲨系列天线&#xff0c;以其独特的外观设计和强大的性能&#xff0c;成为德思特Panorama智能天线家族的最新成员。这款天线不仅稳定提供5G、WIFI和GNSS信号&#xff0c;更能在各类复杂环境中展现出卓越的性能。它的设计灵感来源于海洋中的礁鲨&#xff0c;象征着力量…

STM32G030C8T6:EEPROM读写实验(I2C通信)--M24C64

本专栏记录STM32开发各个功能的详细过程&#xff0c;方便自己后续查看&#xff0c;当然也供正在入门STM32单片机的兄弟们参考&#xff1b; 本小节的目标是&#xff0c;系统主频64 MHZ,采用高速外部晶振&#xff0c;实现PB11,PB10 引脚模拟I2C 时序&#xff0c;对M24C08 的EEPRO…

低代码开发平台(Low-code Development Platform)的模块组成部分

低代码开发平台&#xff08;Low-code Development Platform&#xff09;的模块组成部分主要包括以下几个方面&#xff1a; 低代码开发平台的模块组成部分可以按照包含系统、模块、菜单组织操作行为等维度进行详细阐述。以下是从这些方面对平台模块组成部分的说明&#xff1a; …

翻译《The Old New Thing》- What a drag: Dragging a virtual file (HGLOBAL edition)

What a drag: Dragging a virtual file (HGLOBAL edition) - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080318-00/?p23083 Raymond Chen 2008年03月18日 拖拽虚拟文件&#xff08;HGLOBAL 版本&#xff09; 现在我们已经对简单的数据…

MySQL之创建高性能的索引(七)

创建高性能的索引 InnoDB和MyISAM的数据分布对比 聚簇索引和非聚簇索引欸度数据分布有区别&#xff0c;以及对应的主键索引和二级索引的数据分布也有区别&#xff0c;通常会让人感到困扰和意外。来看看InnoDB和MyISAM时如何存储下面这个表的: CREATE TABLE layout_test ( co…

R语言ggplot2包绘制世界地图

数据和代码获取&#xff1a;请查看主页个人信息&#xff01;&#xff01;&#xff01; 1. 数据读取与处理 首先&#xff0c;从CSV文件中读取数据&#xff0c;并计算各国每日收入的平均签证成本。 library(tidyverse) ​ df <- read_csv("df.csv") %>% group_…

自监督表示学习和神经音频合成实现语音修复

关键词&#xff1a;语音修复、自监督模型、语音合成、语音增强、神经声码器 语音和/或音频修复的目标是增强局部受损的语音和/或音频信号。早期的工作基于信号处理技术&#xff0c;例如线性预测编码、正弦波建模或图模型。最近&#xff0c;语音/音频修复开始使用深度神经网络&a…

用万界星空科技低代码平台能快速搭建一个云MES系统

一、低代码平台与MES:智能制造的新篇章 随着工业4.0和智能制造的兴起&#xff0c;企业对于生产过程的数字化、智能化需求日益迫切。传统的MES系统实施周期长、成本高&#xff0c;成为许多企业数字化转型的瓶颈。而低代码开发平台的出现为这一问题提供了新的解决思路。 二、万界…

Linux常用环境Docker安装

一、mysql安装 简单安装 docker run -d \--name mysql \-p 3306:3306 \-e TZAsia/Shanghai \-e MYSQL_ROOT_PASSWORD123 \mysql mysql容器本地挂载 cd /usr mkdir mysql cd mysql/ mkdir data mkdir conf mkdir init可以手动导入自己的数据库信息 docker run -d \--name mys…

MES系统的功能、架构及应用价值

MES系统生产过程控制的主要方面涵盖了生产计划与控制、生产调度与排程、数据采集与监控、质量控制与管理、物料管理与控制以及设备管理与维护等多个方面。这些功能共同构成了MES系统的核心价值&#xff0c;帮助企业实现生产过程的数字化、智能化和精细化管理。 一、工厂使用MES…

Opera 浏览器与Google联手,推出由Gemini驱动的全新AI功能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

JavaScript 动态网页实例 —— 窗口控制

除了打开和关闭窗口之外,还有很多其他控制窗口的方法。例如,可以使用 window.focus()方法使窗口获得焦点,也可以利用与其相对的window.blur 方法使窗口失去焦点。本节介绍移动窗口、改变窗口大小、窗口滚动、窗口超时操作、常用窗口事件、常用窗口扩展等窗口控制的方法和手段。…

AI办公自动化:用通义千问Qwen-Long批量总结PDF长文档内容

Qwen-Long是在通义千问针对超长上下文处理场景的大语言模型&#xff0c;支持中文、英文等不同语言输入&#xff0c;支持最长1000万tokens(约1500万字或1.5万页文档)的超长上下文对话。配合同步上线的文档服务&#xff0c;可支持word、pdf、markdown、epub、mobi等多种文档格式的…

HCIP-Datacom-ARST自选题库__BGP/MPLS IP VPN判断【10道题】

1.部署BGP/MPLSIP VPN时,当两个VPN有共同的站点,则该共同站点一定不能与两个VPN其他站点使用重叠的地址空间。 2.如图所示&#xff0c;运营商BGP/MPLSIP VPN骨干网通过LDP构建LSP&#xff0c;若想实现用户X两个站点之间通过BGP/MPLSIP VPN网络互通&#xff0c;则PE1和PE2之间必…

大规模 Transformer 模型 8 比特矩阵乘

本文基于 Hugging Face Transformers、Accelerate 以及 bitsandbytes库。 Transformers&#xff1a;Hugging Face 提供的一个开源库&#xff0c;包含了多种预训练的 Transformer 模型&#xff0c;方便用户进行各种 NLP 任务。Accelerate&#xff1a;Hugging Face 开发的一个库…

【STM32】定时器与PWM的LED控制

目录 一、定时器控制LED周期性亮灭&#xff08;一&#xff09;定时器1.STM32F103定时器分类及区别2.通用定时器主要功能3.通用定时器工作过程 &#xff08;二&#xff09;STM32CubeMX创建工程&#xff08;三&#xff09;代码实现&#xff08;四&#xff09;实验结果 二、PWM模式…

7.1 Go 错误的概念

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

富士摄像机X-H2S MOV格式化后重新写入后的恢复方法

X-H2S是富士数码的一款旗舰机型&#xff0c;支持4K/6K高清&#xff0c;视频编码为最新的HVC。下面我们来看下富士数码摄像机恢复案例。 故障存储:512G存储卡 Exfat文件系统 故障现象: 512G的卡误格式化后又进行了拍摄&#xff0c;卡使用了120G不到的空间&#xff0c;其它底…

深入分析 Android Service (五)

文章目录 深入分析 Android Service (五)1. 深入分析 Service 与 Activity 之间的通信2. Messenger 的内部工作原理2.1 服务端实现2.2 客户端实现 3. AIDL 的内部工作原理3.1 定义 AIDL 接口3.2 服务端实现3.3 客户端实现 4. Service 的优化建议和最佳实践4.1 异步操作4.2 资源…