深度学习设计模式之装饰器模式

news2024/11/18 3:25:58

文章目录

  • 前言
  • 一、介绍
  • 二、详细分析
    • 1.核心组成
    • 2.实现步骤
    • 3.代码示例
    • 4.优缺点
      • 优点
      • 缺点
    • 5.使用场景
  • 总结


前言

装饰器模式属于结构型模式,又叫包装设计模式,动态的将责任添加到对象上。


一、介绍

装饰器模式又叫包装设计模式,为现有的类的一个包装,允许向一个现有的对象添加新的功能,同时又不改变其结构。给对象增加功能,一般两种方式 继承或关联组合,将一个类的对象嵌入另一个对象中,由另一个对象来决定是否调用嵌入对象的行为来增强功能,这个就是装饰器模式,比继承更加灵活。

二、详细分析

1.核心组成

  • 抽象组件(Component):定义装饰⽅方法的规范;
  • 被装饰者(ConcreteComponent):Component的具体实现,也就是我们要装饰的具体对象;
  • 装饰者组件(Decorator):定义具体装饰者的行为规范, 和Component角色有相同的接口,持有组件(Component)对象的实例例引用;
  • 具体装饰物(ConcreteDecorator):负责给构件对象装饰附加的功能。

在这里插入图片描述

2.实现步骤

  1. 创建抽象组件,定义公用的方法;
  2. 创建被抽象者,实现抽象组件接口,实现基础方法;
  3. 创建装饰者,实现抽象组件接口,可不做实现;
  4. 创建具体抽象者,继承装饰者类,实现具体方法,添加抽象组件属性。

3.代码示例

抽象组件

/**
 * 抽象组件
 */
public interface Computer {

    /**
     * 描述
     */
    String getDesc();

    /**
     * 价格
     * @return
     */
    int getPrice();

}

被装饰者

/**
 * 被装饰者
 */
public class DesktopComputer implements Computer {

    private String desc = "台式机";

    @Override
    public String getDesc() {
        return desc;
    }

    @Override
    public int getPrice() {
        return 5000;
    }
}
/**
 * 被装饰者
 */
public class LaptopComputer implements Computer {

    private String desc = "笔记本电脑";
    @Override
    public String getDesc() {
        return desc;
    }

    @Override
    public int getPrice() {
        return 6000;
    }
}

装饰者

/**
 * 装饰者
 */
public class ComputerDecorator implements Computer {

    private String desc = "";

    @Override
    public String getDesc() {
        return desc;
    }

    @Override
    public int getPrice() {
        return 0;
    }
}

具体装饰物

/**
 * 具体装饰者
 */
public class RAMComputerDecorator extends ComputerDecorator{

    private Computer computer;

    public RAMComputerDecorator(Computer computer) {
        this.computer = computer;
    }

    private String desc = "增加16G内存";

    @Override
    public String getDesc() {
        return computer.getDesc()+","+desc;
    }

    @Override
    public int getPrice() {
        return computer.getPrice() + 500;
    }
}
/**
 * 具体装饰物
 */
public class SSDComputerDecorator extends ComputerDecorator{

    private Computer computer;

    private String desc = "增加1T的固态硬盘";

    public SSDComputerDecorator(Computer computer) {
        this.computer = computer;
    }

    @Override
    public String getDesc() {
        return computer.getDesc()+","+desc;
    }

    @Override
    public int getPrice() {
        return computer.getPrice()+1000;
    }
}

测试类

 public static void main(String[] args) {
        Computer computer = new DesktopComputer();
        // 增加硬盘
        computer = new SSDComputerDecorator(computer);
        // 增加内存
        computer = new RAMComputerDecorator(computer);

        System.out.println(computer.getDesc()+",价格为:"+computer.getPrice());

    }

结果:
在这里插入图片描述

4.优缺点

优点

  • 可以在运行时动态地给一个对象添加额外的职责。
  • 装饰类会继承原始类的所有接口和实现,因此对于客户端来说,装饰对象和原始对象可以无缝替换。
  • 当需要修改现有功能或添加新功能时,可以通过添加新的装饰类来实现,而不需要修改原有的代码。

缺点

  • 每增加一个装饰器,系统中就多了一个类,这可能会使系统变得更加复杂。
  • 随着装饰器数量的增加,管理这些装饰器可能会变得困难。

5.使用场景

  • 当需要动态地给对象添加额外功能时,装饰器模式可以在运行时通过组合的方式来增强对象的功能,而不需要通过继承来静态扩展。
  • 当通过继承来扩展功能导致类的数量急剧增加,形成复杂的继承体系时,装饰器模式可以作为一种替代方案来简化设计。

总结

以上就是今天要讲的内容,本文简单介绍了装饰器模式的优缺点和使用场景,提供了代码示例。装饰器模式也在Java IO类中的输入输出流中被广泛使用,大家有兴趣可以再看下相关资料代码。

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

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

相关文章

四川音盛佳云电子商务有限公司引领抖音电商新风潮

在数字化浪潮席卷全球的今天,电商行业已成为推动经济发展的重要力量。作为这一领域的佼佼者,四川音盛佳云电子商务有限公司凭借其在抖音电商服务领域的专业实力和独特视角,正引领着行业的新风潮,助力品牌实现快速增长和腾飞。 四…

淘宝镜像的https证书过期

错误原因: 淘宝镜像过期 早在 2021 年,淘宝就发文称,npm 淘宝镜像已经从 http://registry.npm.taobao.org 切换到了 http://registry.npmmirror.com。旧域名也将于 2022 年 5 月 31 日停止服务(直到 HTTPS 证书到期才真正不能用了…

用例与系统顺序图

习题 问题 考察点 1.Use Cases 用例绘制 列出8个Use Cases, 按优先权分成三个档次, 并分别用Fully dressed、Causual和Brief方式描述 建议:用Fully dressed方式描述的Use Cases应该是项目比较核心,而且需要尽快研制的功能模块;该功能模块的内容比较充实;不要采用如登陆验…

【百度之星比赛】

新材料 直接模拟:因为要考虑上次出现的位置,所以使用map映射最好,如果没有出现过就建立新映射,如果出现过但是已经反应过就跳过,如果出现过但是不足以反应,就建立新映射,如果能反应就反应&#…

攻防实战 | 邮件高级威胁检测与自动化响应

历经三个月的时间,年度重磅直播节目Fortinet 2024年度“Demo季”近日终于迎来了备受瞩目的压轴大戏——Demo Day第三期,主题为《新邮件安全下的高级威胁检测与自动化响应》。继成功举办了前两期《企业网络中的多源威胁情报自动化整合与集成》和《应急响应…

20.Redis之缓存

1.什么是缓存? Redis 最主要的用途,三个方面:1.存储数据(内存数据库)2.缓存 【redis 最常用的场景】3.消息队列【很少见】 缓存 (cache) 是计算机中的⼀个经典的概念. 在很多场景中都会涉及到. 核⼼思路就是把⼀些常⽤的数据放到触⼿可及(访问速度更快)的地⽅, ⽅…

Windows 11 Beta 22635.3646 预览版发布:中国大陆地区新增“微软电脑管家”应用

微软今天面向 Beta 频道的 Windows Insider 项目成员,发布了适用于 Windows 11 的 KB5037858 更新,用户安装后版本号升至 Build 22635.3646,该版本主要为中国大陆设备新增“微软电脑管家”应用。 IT之家 5 月 24 日消息,微软今天…

从零自制docker-15-【实现 mydocker run -d 支持后台运行容器】

文章目录 实现目的莫名奇妙的问题对之前upper层出现root补充对run某些命令出现找不到文件或目录的原因代码效果 实现目的 docker run -d时容器在后台运行,而不会进入命令行交互形式 首先是需要添加-d选项然后设置当添加-d选项时候主进程不会等待子进程&#xff0c…

ollama入门系列教程简介与目录

教程简介 Ollama教程系列是为那些希望深入了解并掌握Ollama框架的开发者设计的。通过这一系列的教程,用户将学习如何从基础设置到高级功能的各个方面,有效地在Ollama平台上开发和部署大型语言模型。本系列包括如何将模型导入Ollama框架、利用与OpenAI兼容的API、以及如何使用…

关于ida如何进行远程linux调试(详解)

首先我们需要安装工具软件VMware虚拟机和finalshell,并在虚拟机中安装centos 7系统,还要将finalshell连接到该系统中,具体操作可以去b站搜黑马Linux学习,学完该课程的p5,p6,p8即可,我接下来讲的…

CentOS7.9部署安装OpenGauss 5.0.2企业版

1、更新系统: yum update -y 2、更改主机名: hostnamectl set-hostname opendb01 3、关闭透明页: echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag# 加入开机自启动 echo …

[数据集][目标检测][数据集][目标检测]智能手机检测数据集VOC格式5447张

数据集格式:Pascal VOC格式(不包含分割的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):5447 标注数量(xml文件个数):5447 标注类别数:1 标注类别名称:["phone"] 每个类别标注的框数&#xff…

容器技术基础理论与常用命令:必知必会,效率翻倍!

如何利用容器技术提升你的工作效率?掌握基础理论和常用命令是必不可少的,本文将为你全面介绍容器技术,并教你必知必会的技能,让你工作、学习效率翻倍,对于网络安全工作者也是必不可少的技能! 0. 引言 学习…

大型制造业集团IT信息化总体规划方案(65页PPT)

方案介绍: 本大型制造业集团IT信息化总体规划方案旨在通过构建先进、高效、稳定的IT信息化系统,支撑集团各业务领域的运营和管理需求,促进集团整体运营效率和竞争力的提升。通过实施本项目,集团将能够更好地应对市场变化和客户需…

python编程:创建 SQLite 数据库和表的图形用户界面应用程序

在本文中,我将介绍如何使用 wxPython 模块创建一个图形用户界面(GUI)应用程序,该应用程序允许用户选择 SQLite 数据库的存放路径、数据库名称、表名称,并动态添加字段及其类型。以下是具体的实现步骤和代码示例。 C:\p…

LeetCode503:下一个更大元素Ⅱ

题目描述 给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这…

配置arduino和ESP8266

首先准备好arduino 的IDE和ESP8266的驱动以及板子 1.安装驱动,双击x64的版本驱动,安装好以后,在资源管理器检查端口,比如下下图出现的COM4就是esp8266所使用的端口 2.安装好arduino最好不要在路径中存在中文符号,打开…

专升本的硕士学历被歧视了。。

精品推荐: 《征服数据结构》,《经典图论算法》 在牛客网上看到一个帖子,一网友说之前已经签了一家公司,现在又找了一家公司,并且这家公司也发了offer,让他和上一家公司解约。结果他和上一家公司解约完之后&…

FENDI CLUB精酿啤酒中原麦汁浓度的高低有何区别?

关于精酿啤酒,有两个关键数据,一个是原麦汁浓度,一个是酒精度。酒精度无非是含酒精的高低,但原麦汁浓度又是什么呢?另外精酿啤酒中原麦汁浓度有高有低,究竟有哪些区别呢? 原麦汁浓度是指啤…

【面试八股总结】MySQL索引(二):B+树数据结构、索引使用场景、索引优化、索引失效

参考资料:小林coding、阿秀 一、为什么InnoDB采用B树作为索引数据结构? B 树是一个自平衡多路搜索树,每一个节点最多可以包括 M 个子节点,M 称为 B 树的阶,所以 B 树就是一个多叉树。 B 树与 B 树的差异:…