设计模式 装饰模式(Decorator Pattern)

news2024/11/24 6:19:28

装饰器模式简绍

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

装饰器模式的基本结构

装饰器模式的基本结构如下:

  • Component(组件接口):定义了所有实体类和装饰器共同遵循的接口。
  • ConcreteComponent(具体组件):实现了 Component 接口的基础组件类。
  • Decorator(装饰器):实现了 Component 接口的抽象类或接口,它包含一个对 Component 类型的引用,可以用来包装具体的组件或其他装饰器。
  • ConcreteDecorator(具体装饰器):这些类扩展了 Decorator 类,并提供了额外的行为。

装饰器优缺点

优点
  • 灵活性:
    • 动态扩展功能:装饰器模式允许在不修改原有类的基础上动态地添加职责或功能,这意味着可以在运行时根据需要添加或移除特性,提供了极大的灵活性。
  • 透明性:
    • 统一接口:装饰器类和具体组件类都遵循相同的接口,这样客户端代码就可以透明地处理所有对象,无论是基础对象还是装饰过的对象。
  • 易于扩展:
    • 避免多重继承:装饰器模式提供了一种替代继承的方式,可以在不破坏现有类层次结构的情况下扩展功能,这有助于避免由于多重继承带来的复杂性和维护上的困难。
  • 符合开放封闭原则:
    • 开放封闭原则:在不修改现有代码的情况下扩展系统的功能,符合 SOLID 原则中的开放封闭原则(OCP)。
  • 简化系统:
    • 减少子类数量:通过组合而不是继承来实现功能的扩展,减少了不必要的子类数量,使类层次更加清晰简洁。
缺点
  • 对象数量增加:
    • 大量装饰器对象:如果需要多次装饰同一个对象,可能会导致系统中存在大量的装饰器对象,增加了内存消耗和垃圾回收的压力。
  • 调试困难:
    • 装饰链复杂度:当装饰器层层叠加时,调试和理解整个装饰过程可能会变得较为复杂,尤其是当装饰器之间存在交互时。
  • 性能影响:
    • 性能开销:每次通过装饰器传递方法调用都会带来一定的性能开销,尤其是在装饰器层次较多的情况下。
  • 设计复杂性:
    • 引入额外复杂性:虽然装饰器模式简化了对象层次结构,但它也可能引入新的复杂性,特别是在需要管理多个装饰器之间的关系时。

类图

  • DecoratorComponent
    • 封装接口类
  • Meizu
    • 实现对应接口
  • Xiaomi
    • 实现对应接口
  • PhoneDecorator
    • 抽象装饰器
  • AdditionalPhoneDecorator
    • 开始 强化装饰类,添加更多方法,为原有功能添加额外方法
      在这里插入图片描述

实现代码

场景

目前手里两台手机,分别是小米跟魅族之前有两个功能可以运行跟停止软件,现在需要一个关机操作,但不想去修改那么多方法,通过装饰类去增强添加一个共有的方法,可以避免更多的改动

创建 DecoratorComponent 实现类信息,封装两个接口, 分别是执行跟停止

public interface DecoratorComponent {

    public void execute();

    public void stop();

}

创建 meizu 实现 DecoratorComponent 实现类,并初始化两个接口, 这里用meizu

public class Meizu implements DecoratorComponent{

    @Override
    public void execute() {
        System.out.println("魅族启动软件");
    }

    @Override
    public void stop() {
        System.out.println("魅族停止软件运行");
    }
}

创建 Xiaomi 实现 DecoratorComponent 实现类,并初始化两个接口

public class Xiaomi implements DecoratorComponent{
    @Override
    public void execute() {
        System.out.println("小米启动软件");
    }

    @Override
    public void stop() {
        System.out.println("小米停止软件运行");
    }
}

添加 抽象装饰类 包含前接口的所有信息

public abstract class PhoneDecorator implements DecoratorComponent {

    protected  DecoratorComponent decoratorComponent;

    public PhoneDecorator(DecoratorComponent decoratorComponent){
        this.decoratorComponent = decoratorComponent;
    }

    @Override
    public void execute() {
        decoratorComponent.execute();
    }

    @Override
    public void stop() {
        decoratorComponent.stop();
    }
}

实现抽象装饰类,扩展原有实体类的方法以及其他相关的

public class AdditionalPhoneDecorator extends PhoneDecorator{
    public AdditionalPhoneDecorator(DecoratorComponent decoratorComponent) {
        super(decoratorComponent);
    }

    public void shutdown(){
        System.out.println("手机关机");
    }
}


具体实现, 增强装饰类可以添加原有信息并进行强化

public class Main {
    public static void main(String[] args) {
        AdditionalPhoneDecorator xiaomi = new AdditionalPhoneDecorator(new Xiaomi());
        AdditionalPhoneDecorator meizu = new AdditionalPhoneDecorator(new Meizu());
        xiaomi.execute();
        xiaomi.stop();
        xiaomi.shutdown();
        meizu.execute();
        meizu.stop();
        meizu.shutdown();
    }
}
  • 动态扩展功能:
    • 装饰器模式可以在不改变原有对象的基础上,动态地给对象添加新的功能或职责。这对于扩展对象功能非常有用,因为它是通过创建新的类而不是修改现有的类来完成的。
  • 替代继承:
    • 当系统中有很多小功能需要组合在一起时,使用继承会使得类的数量呈指数增长(如果每个功能都是单独的子类)。装饰器模式可以作为一种替代继承的方法,通过组合来达到类似的效果,而且更加灵活。
  • 封装组件及其行为:
    • 装饰器通常用来包装抽象组件,这样可以在不同的时间点增加行为,而无需修改原始组件的代码。这种模式使得可以独立于其他对象来设计细节行为。
  • 提供比继承更灵活的替代方案:
    • 继承关系是静态的,是在编译期确定的;而装饰器模式提供了一种更加灵活的方式来扩展对象的功能,可以在运行时决定。
  • 透明地增强功能:
    • 在客户端看来,装饰器对象与它所装饰的组件对象是一致的,即客户端可以透明地调用它们,而不必关心它们是否被装饰。

在实际开发中,装饰器模式可以应用于很多地方,比如在Web开发中,它可以用来动态地向HTTP响应添加额外的头部信息或者对内容进行编码/解码等。

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

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

相关文章

【数据管理】DAMA-数据安全

目录 1、概述 2、数据安全要求来源 3、业务驱动因素 4、目标和原则 5、脆弱性、威胁、风险 6、风险分类 7、安全过程 8、数据完整性 9、混淆或脱敏 10、数据安全类型 11、数据安全制约因素 12、系统安全风险 13、工具 1、概述 数据安全包括安全策略和过程的规划、…

无人机动力系统设计之电调芯片参数选型

无人机动力系统设计之电调芯片参数选型 1. 源由2. 关键因素2.1 电压范围2.2 电流处理能力2.3 控制方式2.4 PWM输出与分辨率2.5 通讯接口2.6 保护功能2.7 支持霍尔传感器与无传感器模式2.8 集成度与外围器件2.9 效率与散热2.10 市场供应与成本 3. 因素阐述3.1 PWM工作频率3.1.1 …

二次规划及其MATLAB实现

引言 二次规划(Quadratic Programming, QP)是一类重要的优化问题,其目标函数为二次函数,约束条件为线性不等式或等式。二次规划问题在工程、经济、金融等领域有广泛应用,如投资组合优化、人脸表情动画的权重求解、机械…

UE中如何制作后处理设置面板

1)UE中如何制作后处理设置面板 2)Magica Clothes 2插件与Burst编译问题 3)UI大小和文本变量 4)如何检索直线与网格的所有交点 这是第399篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社…

tabBar设置底部菜单选项以及iconfont图标,setTabBar设置TabBar和下拉刷新API

tabBartabBar属性:设置底部 tab 的表现 ​ ​ ​ ​ 首先在pages.json页面写一个tabBar对象,里面放入list对象数组,里面至少要有2个、最多5个 tab, 如果只有一个tab的话,H5(浏览器)依然可以显示底部有一个导航栏,如果没有,需要重启后才有,小程序则报错,只有2个以上才可以…

51单片机-蜂鸣器介绍-1

作者:王开心 时间:2024.9.11 目的:学习51进阶中。。。 蜂鸣器是一种一体化结构的电子讯响器, 采用直流电压供电, 广泛应用于计算机、 打印机、 复印机、 报警器、 电子玩具、 汽车电子设备、 电话机、 定时器等电子…

数学 |x-2| + 2|x-5| = 12 ,那么x = ?

1、先上图,问了一下AI,这AI的节奏是不认识这个。 2、这个题的解题思路:如何去掉绝对值符号,让这个题看上去正常一些,然后就可以解。 |x-2| 这个代表,x到2的距离。|x-5| 这个代表,x到5的距离。 …

基于SSM的“高校就业管理系统”的设计与实现(源码+数据库+文档)

基于SSM的“高校就业管理系统”的设计与实现(源码数据库文档) 开发语言:Java 数据库:MySQL 技术:SSM 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 首界面 后台首页 各管理功能 摘要 本论文主要讲述了基于SSM框…

移动UI案例:交通旅行类整套案例

1. 地图导航: 提供地图展示、路线规划、实时导航等功能,帮助用户找到目的地并提供最佳路线。 2. 公交线路查询: 提供公交车站信息、线路查询、实时公交到站信息等功能,方便用户使用公共交通工具。 3. 实时交通信息:…

0基础跟德姆(dom)一起学AI Python进阶10-算法和数据结构

* 自定义代码-模拟链表 * 删除节点 * 查找节点 * 算法入门-排序类的 * 冒泡排序 * 选择排序 * 插入排序 * 快速排序 * 算法入门-查找类的 * 二分查找-递归版 * 二分查找-非递归版 * 分线性结构-树介绍 * 基本概述 * 特点和分类 * 自定义代码-模拟二叉树 …

windows下关闭解除占用端口的进程

环境:windows 10 场景:启动某一应用程序时,提示其他应用已占用此端口,比如端口2425。 解决步骤: 1/3、打开windows的命令提示符,输入以下命令,查找占用此端口2425的PID号: # win…

winpe是什么意思_winpe制作详细图文教程

有些小白很好奇,winpe是什么意思?所谓的winpe系统其实就是当我们的电脑出现问题而不能进入正常系统时候的一种“紧急备用”系统。如果需要重装操作系统的话,以往采用光盘使用的比较多,随着技术的进步,用u盘制作一个winpe去安装系…

中国(分31省、分196个国家地区、分19个行业)对外直接投资存量及流量(2003-2022年)

2003-2022年中国(分31省、分196个国家地区、分19个行业)对外直接投资存量及流量_分行业资本存量数据资源-CSDN文库https://download.csdn.net/download/2401_84585615/89475600 相关数据 中国(31省)对外非金融类直接投资存量及流…

【C语言 vs C++:编译过程详解与对比】

C语言 vs C:编译过程详解与对比 对于初学编程的人来说,C语言和C语言的编译过程有着很多相似之处,但它们也有显著的区别。本文将带你详细了解C和C编译的整个流程,并对比两者的主要不同点。 1. C 和 C 的编译过程简介 在现代编程中…

网络操作系统项目

部署与管理Active Directory 项目基础知识 活动目录是一种由微软开发的网络服务,用于在网络环境中管理和组织用户、计算机和其他网络资源。它是基于目录服务的概念,类似于电话号码簿。 活动目录主要用于集中管理网络中的用户帐户、组织单位、计算机、打…

在 openEuler 系统中,设置补全功能可以提高命令行操作的效率。

目录 1.在 openEuler 系统中,设置补全功能可以提高命令行操作的效率。你可以通过以下步骤设置命令行补全功能 安装 Bash 补全工具 启用 Bash 补全 保存并关闭文件后,重新加载配置: 🌐 无论你是初学者还是经验丰富的专家&#x…

如何从损坏的 Mac 或外部驱动器恢复数据

告诉人们要备份是件好事。但人性意味着,寻求备份建议通常是在最坏的情况已经发生之后才会发生。希望您能够按照我们的建议修复损坏的驱动器并恢复数据,但我们还将介绍您需要了解的有关没有备份而崩溃的信息以及如何从损坏的硬盘或外部驱动器中恢复数据。…

ssm框架下实现手机营业厅连签送流量

功能概述 模拟常见手机营业厅APP登录签到领取流量功能,利用SSM框架完成登录签到领取流量,具体功能如下: 用户登录之后方可签到,点击签到,领取10积分,每天最多签到一次 一个月内只要连续登录签到7天&…

西圣find、蜂鸟t15、善尼体可视挖耳勺值得买吗?全方面测评实力王者品牌

可视挖耳勺作为一种新兴的掏耳神器,在市场上受到了广泛欢迎,各大品牌纷纷推出新品。然而,近期网络上关于可视挖耳勺的负面声音也在增多。不少消费者反映在使用过程中出现画质低清、画面卡顿等现象。作为一名居家物品测评博主,我对…

移动瑜伽馆:随时随地,开启身心之旅—轻空间

在快节奏的现代生活中,人们对健康与平衡的追求愈发强烈,瑜伽作为一种身心结合的运动,正受到越来越多人的青睐。然而,传统瑜伽场馆的固定场地、长时间建设与高昂的成本,常常限制了其普及和发展。如今,一种全…