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

文章目录

  • 前言
  • 一、介绍
  • 二、详细分析
    • 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 = "台式机";@Overridepublic String getDesc() {return desc;}@Overridepublic int getPrice() {return 5000;}
}
/*** 被装饰者*/
public class LaptopComputer implements Computer {private String desc = "笔记本电脑";@Overridepublic String getDesc() {return desc;}@Overridepublic int getPrice() {return 6000;}
}

装饰者

/*** 装饰者*/
public class ComputerDecorator implements Computer {private String desc = "";@Overridepublic String getDesc() {return desc;}@Overridepublic int getPrice() {return 0;}
}

具体装饰物

/*** 具体装饰者*/
public class RAMComputerDecorator extends ComputerDecorator{private Computer computer;public RAMComputerDecorator(Computer computer) {this.computer = computer;}private String desc = "增加16G内存";@Overridepublic String getDesc() {return computer.getDesc()+","+desc;}@Overridepublic 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;}@Overridepublic String getDesc() {return computer.getDesc()+","+desc;}@Overridepublic 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.rhkb.cn/news/340986.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RaspAP:轻松实现树莓派无线 AP

RaspAP 是一个可以将树莓派轻松部署成无线 AP(Access Point)的软件方案,具有一套响应式的 WebUI 来控制 WiFi,用起来和家用路由器一样方便。RaspAP 可以运行在 Raspbian 上,只需要先给树莓派安装好 Raspbian 系统&…

分享一个 ASP.NET WebForm 使用 Form Authentication 的例子

前言 前些天一个朋友说他们客户的网站出了点故障,让我帮忙看看,这个网站还是用 ASP.NET WebForm 做的,很久以前的技术了,不过很多客户就是这样,只要网站还能稳定地运行,一般就不会去折腾升级,_…

读AI未来进行式笔记03自然语言处理技术

1. AI伙伴 1.1. 作为AI能力的集大成者,AI伙伴融合了各种复杂的AI技术 1.2. 人类唯一可能超越AI的领域,只可能在机器无法触及之处,那是属于人类感性与直觉的领域 1.3. 要读懂人类,需要漫长而平缓的学习过程 1.4. AI塑造了我们&…

什么是OCR转写服务?

OCR(Optical Character Recognition,光学字符识别)转写服务是一种技术,用于将图像或扫描文档中的文字转换为可编辑的文本格式。这项服务通过识别图像中的文字,并将其转换成计算机可读的文本形式,从而使得用…

uni-app+php 生成微信二维码 分销海报

主要代码如下,可直接复制调试参数: //查询当前用户是否有分销海报public function user_poster(){$this->checkAuth();//查询会员信息$user $this->getUserInfoById($this->user_id);if(!empty($user[distribution_img])){$result[data] $use…

vue2中使用tinymce

vue2中使用tinymce的记录 本篇文章主要实现的功能: (1)【查看】时禁用编辑 (2)【编辑】时某些内容是不可编辑的 实现效果图: 第一个功能的主要代码 disabled属性 // 使用地地方,传递disabled属…

白银票据~

一. 白银票据的原理 白银票据就伪造ST票据, kerberoasting是破解ST票据中的服务用户hash值,有以下区别: 白银票据:伪造的ST使用的是机器用户的Hash值 Kerberoasting:破解的是ST的域用户的hash值二. 白银票据的利用条件 1.域名 …

Python第二语言(二、Python语言基础)

目录 1. python中常用的6中数据类型 2. Print语句(输出程序) 3. 字面量 4. 注释 5. 变量 6. 数据类型 7. type()语句:查询数据类型 8. 数据类型转换语句 9. 标识符 10. 算术运算符 11. 赋值运算符 && 复合赋值运算符 12. …

Oracle导出clob字段到csv

使用UTL_FILE ref: How to Export The Table with a CLOB Column Into a CSV File using UTL_FILE ?(Doc ID 1967617.1) --preapre data CREATE TABLE TESTCLOB(ID NUMBER, MYCLOB1 CLOB, MYCLOB2 CLOB ); INSERT INTO TESTCLOB(ID,MYCLOB1,MYCLOB2) VALUES(1,Sample row 11…

Spring boot实现基于注解的aop面向切面编程

Spring boot实现基于注解的aop面向切面编程 背景 从最开始使用Spring,AOP和IOC的理念就深入我心。正好,我需要写一个基于注解的AOP,被这个注解修饰的参数和属性,就会被拿到参数并校验参数。 一,引入依赖 当前sprin…

【scikit-learn009】异常检测系列:单类支持向量机(OC-SVM)实战总结(看这篇就够了,已更新)

1.一直以来想写下机器学习训练AI算法的系列文章,作为较火的机器学习框架,也是日常项目开发中常用的一款工具,最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下scikit-learn框架OCSVM模型相关知识体系。 3.欢迎批评指正,欢迎互三,跪谢一键三连! 4.欢迎…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第35课-3D互动教材

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第35课-3D互动教材 使用dtns.network德塔世界(开源的智体世界引擎),策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎&am…

LeetCode题练习与总结:填充每个节点的下一个右侧节点指针Ⅱ--117

一、题目描述 给定一个二叉树: struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL 。 初始状态下,所…

第二十七章HTML.CSS综合案例

1.产品介绍 效果图如下&#xff1a; 代码部分如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

计算机毕业设计Python+Spark新能源汽车推荐系统 汽车大数据 汽车数据分析 汽车可视化 汽车爬虫 大数据毕业设计 大数据毕设 知识图谱 深度学习

黄河交通学院本科毕业设计&#xff08;论文&#xff09;任务书 学院&#xff1a;智能工程学院 学生姓名 刘丹杰 专业班级 大数据20-1班 学号 2080910T01521 指导教师 炎士涛 职称 副教授 学位 硕士 题目名称 基于Hadoop的新能源汽车销售数据分析系统的设计与实现…

【Unity美术】spine软件的使用—2D动画的制作

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…

群体优化算法---灰狼优化算法学习介绍以及在卷积神经网络训练上的应用

**长文预警**介绍 在自然界中&#xff0c;狼群的社会结构和捕猎策略展现了高度的智能和协调性&#xff0c;灰狼优化算法&#xff08;Grey Wolf Optimizer, GWO&#xff09;正是受此启发提出的一种群体智能优化算法。GWO主要模拟了灰狼的社会等级制度和捕猎行为&#xff0c;其核…

计算机毕业设计hadoop+spark+hive知识图谱音乐推荐系统 音乐数据分析可视化大屏 音乐爬虫 LSTM情感分析 大数据毕设 深度学习 机器学习

新余学院本科毕业设计(论文)开题报告 学 号 202253025 学生姓名 毛维星 届 别 24届 专 业 数据科学与大数据技术 指导教师 姓名及职称 潘诚 研究生 毕业设计 (论文)题目 基于HadoopSpark的音乐数据仓库的设计与实现 开 题 报 告 内 容 选题的依据…

使用Python操作Redis

大家好&#xff0c;在当今的互联网时代&#xff0c;随着数据量和用户量的爆发式增长&#xff0c;对于数据存储和处理的需求也日益增加。Redis作为一种高性能的键值存储数据库&#xff0c;以其快速的读写速度、丰富的数据结构支持和灵活的应用场景而备受青睐。本文将介绍Redis数…

加密经济浪潮:探索Web3对金融体系的颠覆

随着区块链技术的快速发展&#xff0c;加密经济正在成为全球金融领域的一股新的浪潮。而Web3作为下一代互联网的代表&#xff0c;以其去中心化、可编程的特性&#xff0c;正深刻影响着传统金融体系的格局和运作方式。本文将深入探讨加密经济对金融体系的颠覆&#xff0c;探索We…