Java设计模式之结构型-装饰器模式

news2024/11/20 13:16:24

目录

一、基本概念

二、角色设计

三、代码实现

四、总结 


一、基本概念

装饰器模式是指不必在改变原有的类和不使用继承的情况下,动态扩展一个对象的功能。

二、角色设计

c3307e6d567d41ea9403f8464b53c330.png

角色描述
抽象构件是一个接口或者抽象类,定义我们最核心的对象
基础构件抽象构件的实现,可以单独用,也可以将其进行装饰
装饰角色一般是一个抽象类,继承自或实现抽象构件,在它的属性中有个变量指向抽象构建,这是关键
具体装饰角色Type-C充电和Wireless充电是两个具体的装饰类,可以把基础构件进行装饰,延伸出新的功能

三、代码实现

假设一个场景,以前手机充电只有usb充电,但是目前手机多出了2种新的充电方式,Typc-C和无线充电,这就需要我们动态去扩展功能,让我们看看装饰器如何实现的。

1、首先定义一个基本的充电接口,采用usb充电

public interface Charge {
    
    public void usb();
    
}

2、实现一个普通手机去使用usb接口充电

public class PhoneCharge implements Charge{

    @Override
    public void usb() {
        System.out.println("采用usb接口充电...");
    }
    
}

3、 抽象的充电装饰器

public abstract class AbstractPhoneDecorator implements Charge{

    protected final Charge charge;

    public AbstractPhoneDecorator(Charge charge){
        this.charge = charge;
    }

}

4、Type-C充电具体装饰

public class TypeCDecorator extends AbstractPhoneDecorator{


    public TypeCDecorator(Charge charge) {
        super(charge);
    }

    @Override
    public void usb() {
        super.charge.usb();
        System.out.println("采用type-c接口充电...");
    }

}

5、无线充电的具体装饰

public class WirelessDecorator extends AbstractPhoneDecorator{

    public WirelessDecorator(Charge charge) {
        super(charge);
    }

    @Override
    public void usb() {
        super.charge.usb();
        System.out.println("采用无线充电...");
    }
    
}

6、测试类

    public static void main(String[] args) {
        
        Charge charge = new PhoneCharge();
        TypeCDecorator typeCDecorator = new TypeCDecorator(charge);
        WirelessDecorator wirelessDecorator = new WirelessDecorator(typeCDecorator);
        wirelessDecorator.usb();
        
    }

7、运行结果

 

四、总结 

优点:装饰类和被装饰类可以独立发展,降低了耦合,可以动态去扩展一个实现类的功能

缺点:装饰器模式会增加许多的子类,会使代码繁多增加程序复杂性

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

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

相关文章

GD32 SPI 查询方式和DMA方式在全双模式下效率区别

最近在使用SPI的时候,遇到了一些数据传输效率问题,在此记录自己学习过程。SPI的基础知识这里就不在讲述了,直接分析SPI查询方式和DMA方式的效率问题。这里使用的芯片是GD32F303CC。 SPI以查询方式进行全双工通信 1.查询手册,SPI…

java——网络编程

文章目录 网络通信协议1. TCP/IP协议2. HTTP协议 Socket编程1.创建Socket对象2.获取输入输出流3.发送数据4.接收数据5.关闭Socket连接 NIO编程1.创建Channel2.创建Buffer3.从Channel中读取数据4.写入数据到Channel中5.关闭Channel和Stream Java网络编程是使用Java语言实现计算机…

Spark7-9

7. Spark中的一些重要概念 7.1 Application 使用SparkSubmit提交的个计算应用,一个Application中可以触发多次Action,触发一次Action产生一个Job,一个Application中可以有一到多个Job 7.2 Job Driver向Executor提交的作业,触发…

没想到,老刘是逃离北上广的那波人

我今天跟老刘调试的时候,我问了老刘一个问题——我问你工作这么久了,有没有遇到什么可以让你财富自由的机会。 老刘那个时候正在焊板子,背着我,他抬起头又低了下去,然后说「我是有一次机会了,但是没有抓住&…

MySQL-SQL存储函数以及触发器详解

♥️作者:小刘在C站 ♥️个人主页: 小刘主页 ♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏&#xf…

PyTorch翻译官网教程3-DATASETS DATALOADERS

官网链接 Datasets & DataLoaders — PyTorch Tutorials 2.0.1cu117 documentation 数据集和数据加载器 处理样本数据的代码可能会变得混乱并且难以维护。理想情况下,我们希望我们的数据集代码与模型训练代码解耦,以获得更好的可读性和模块化。PyT…

轻松了解工作与学习必备的版本控制+Git,全程舒适~

目录 一、版本控制 二、版本控制器 三、Git 四、项目实操 第一步 在github上创建一个新的远程仓库 第二步 克隆到本地文件夹 第三步 IDEA(PyCharm为例)集成Git 一、版本控制 概念:版本控制是指对软件开发过程中各种程序代码、配置文件…

【spring cloud学习】4、创建服务提供者

注册中心Eureka Server创建并启动之后,接下来介绍如何创建一个Provider并且注册到Eureka Server中,再提供一个REST接口给其他服务调用。 首先一个Provider至少需要两个组件包依赖:Spring Boot Web服务组件和Eureka Client组件。如下所示&…

ADRC自抗扰控制(CODESYS平台完整源代码)

博途PLC ADRC完整源代码请参考下面文章链接: 博途PLC ADRC自抗扰控制完整SCL源代码_adrc控制算法代码_RXXW_Dor的博客-CSDN博客关于自抗扰控制框图可以参看专栏的其它文章,这里不再讲解具体算法过程,详细了解也可以参看韩京清研究员写的 《ADRC自抗扰》一书。_adrc控制算法…

基于混合策略的改进哈里斯鹰优化算法-附代码

基于混合策略的改进哈里斯鹰优化算法 文章目录 基于混合策略的改进哈里斯鹰优化算法1.哈里斯鹰优化算法2.改进哈里斯鹰优化算法2.1 Sobol 序列初始化种群2.2 limit 阈值执行全局搜索阶段2.4 动态反向学习 3.实验结果4.参考文献5.Matlab代码6.python代码 摘要:针对原…

ElasticSearch-Kibana的安装

Kibana的安装 什么是ELK? ELK是Elasticsearch,Logstash,Kibana三大开源框架首字母大写简称,ELK属于大数据,是拆箱即用的,上手比较快 什么是Kibana? Kibana是一个针对ES的开源分析以及可视化平台,用来搜索,查看交互存储在ES索引中的数据,使用Kibana可以通过各类图标进行高级…

Flink(1)-概述

1.1 Apache Flink是什么? 在当前数据量激增的时代,各种业务场景都有大量的业务数据产生,对于这些不断产生的数据应该如何进行有效的处理,成为当下大多数公司所面临的问题。目前比较流行的大数据处理引擎Apache Spark,…

SpringBoot第14讲:SpringBoot 如何统一异常处理

SpringBoot第14讲:SpringBoot 如何统一异常处理 本文是SpringBoot第14讲,SpringBoot接口如何对异常进行统一封装,并统一返回呢?以上文的参数校验为例,如何优雅的将参数校验的错误信息统一处理并封装返回呢 文章目录 Sp…

诊断测试工具CANoe.DiVa从入门到精通系列——开门见山

我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 人们会在生活中不断攻击你。他们的主要武器是向你灌输对自己的怀疑:你的价值、你的能力、你的潜力。他们往往会将此伪装成客观意见,但无一例外的是,他们想…

网络安全就业前景如何?是否还能入行?

网络安全专业是2015年新设立的专业,作为新兴专业吸引了很多人准备入行,那么它的就业前景怎么样?大致可以分为3个版块来介绍。 1.就业领域前景广阔 目前互联网、通信、新能源、房地产、金融证券、电子技术等行业迫切需要网络安全人才&#x…

22. 算法之图的最短路径

前言 关于图的最短路径问题,是图这种数据结构中的经典问题。也是与我们的生活息息相关的,比如上海四通八达的地铁线路,从一个地铁站,到另一个地铁站,可能有很多种不同的路线。那么,我们选哪种路线&#xf…

JavaFX第五篇 Image图片加载处理

JavaFX第五篇 Image图片加载处理 1. 代码2. 讲解3. 代码仓 图片已经成为每个网站的必备了,不仅可以提升个人网站的标识度而且还可以美化网站, 所以这里需要讲解一下如何加载图片,展示到前台给用户查看。 本次只是简单的讲解如何展示使用&…

【算法证明 七】深入理解深度优先搜索

深度优先搜索包含一个递归,对其进行分析要复杂一些。与上一篇文章一样,还是给节点定义几个状态,然后详细分析深度优先搜索算法有哪些性质。 算法描述 定义状态 v . c o l o r :初始状态为白色,被发现时改为灰色&…

Mysql的SQL性能分析【借助EXPLAIN分析】

性能分析 要说sql有问题,需要拿出证据,因此需要性能分析 Mysql查询优化器(Mysql Query Optimizer) Mysql中有专门负责优化SELECT语句的优化器模块,主要功能:通过计算分析系统中收集到的统计信息&#xf…

Xline v0.4.1: 一个用于元数据管理的分布式KV存储

Xline是什么?我们为什么要做Xline? Xline是一个基于Curp协议的,用于管理元数据的分布式KV存储。现有的分布式KV存储大多采用Raft共识协议,需要两次RTT才能完成一次请求。当部署在单个数据中心时,节点之间的延迟较低&a…