Java设计模式——装饰器模式

news2024/11/25 14:33:29

目录

1.什么是装饰器模式

2.装饰器模式优缺点

3.装饰器模式结构

4.代码示例


 

1.什么是装饰器模式

装饰器模式,指在不改变原有对象结构的基础情况下,动态地给该对象增加一些额外功能的职责。装饰器模式相比生成子类更加灵活。它属于对象结构型模式。

装饰器模式强调自身功能的扩展,是代理模式的一个特殊应用。

简单来说,就是一个物件,然后不断在该物件上添加符合该物件的功能,进行扩展。

以生活中的例子为例:

我们点一个快餐,然后炒饭是快餐中的一种。我们以该炒饭为对象物件,在其中加蛋、加肉、加火腿等等(即进行扩展),使得炒饭变得更加美味(功能强大)。

装饰器模式的目标是使用组合关系来创建一个包装对象(即装饰对象)来包裹真实对象,并在保持真实对象的类结构不变的前提下,为其提供额外的功能。

2.装饰器模式优缺点

装饰器模式的主要优缺点有:

  • 装饰器模式可拓展性强,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用。同时,易于维护,哪个功能出问题直接找相关代码即可。
  • 通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果。
  • 装饰器模式会增加许多子类,会使得代码变得繁多增加程序的复杂性。

3.装饰器模式结构

装饰器模式主要包含以下角色。

  • 抽象构件(Component):定义一个抽象接口以规范准备接收附加责任的对象。
  • 具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。
  • 抽象装饰(Decorator):继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
  • 具体装饰(ConcreteDecorator):实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。

所以如上图所示,首先需要有一个Component,规定类别、行为。然后需要有一个ConcreteComponent继承该Component,并规定为具体的物件。接着是一个Decorator,同样继承该Component,同时在该类中传入Component对象进行静态代理。最后是多个ConcreteDecorator继承自Decorator,实现功能的拓展。

4.代码示例

下面是装饰器的应用示例,以圣诞树为例:

1)创建Component对象,规定为Tree,行为功能为输出名字和输出价格:

public abstract class Tree {
    protected abstract  String  getMessage();

    protected abstract int getPrice();
}

2)创建ConcreteComponent,规定为圣诞树:

public class ChristmasTree extends Tree{
    @Override
    protected String getMessage() {
        return "这是一颗圣诞树";
    }

    @Override
    protected int getPrice() {
        return 50;
    }
}

3)创建Decorator对象,进行静态代理

public abstract class ChristmasTreeDecorator extends Tree{
    //静态代理
    private final Tree tree;

    public ChristmasTreeDecorator(Tree tree){
        this.tree=tree;
    }

    @Override
    protected String getMessage() {
        return this.tree.getMessage();
    }

    @Override
    protected int getPrice() {
        return this.tree.getPrice();
    }
}

 4)创建多个ConcreteDecorator对象,实现功能扩展(加装饰球、加缎带)

public class BallDecorator extends ChristmasTreeDecorator{
    public BallDecorator(Tree tree) {
        super(tree);
    }

    @Override
    protected String getMessage() {
        return super.getMessage()+ ", 加了装饰球";
    }

    @Override
    protected int getPrice() {
        return super.getPrice()+20;
    }
}
public class RibbonDecorator extends ChristmasTreeDecorator{
    public RibbonDecorator(Tree tree) {
        super(tree);
    }
    @Override
    protected String getMessage() {
        return super.getMessage()+ ", 加了缎带";
    }

    @Override
    protected int getPrice() {
        return super.getPrice()+10;
    }
}

5)最后,进行测试:

public class test {
    public static void main(String[] args) {
        System.out.println("===来一棵圣诞树===");
        Tree christmasTree = new ChristmasTree();
        System.out.println(christmasTree.getMessage() + ",总价格:" + christmasTree.getPrice() + "元。");

        System.out.println("===加些圣诞球吧===");
        christmasTree = new BallDecorator(christmasTree);
        System.out.println(christmasTree.getMessage() + ",总价格:" + christmasTree.getPrice() + "元。");

        System.out.println("===再加些缎带吧===");
        christmasTree = new RibbonDecorator(christmasTree);
        System.out.println(christmasTree.getMessage() + ",总价格:" + christmasTree.getPrice() + "元。");


    }
}

输出结果:

成功根据需求,获取到了一棵加了装饰球和缎带的圣诞树,并计算出价格。

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

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

相关文章

DCGAN

DCGAN的论文地址[https://arxiv.org/pdf/1511.06434.pdf]。DCGAN是GAN的一个变体,DCGAN就是将CNN和原始的GAN结合到一起,生成网络和鉴别网络都运用到了深度卷积神经网络。DCGAN提高了基础GAN的稳定性和生成结果质量。DCGAN主要是在网络架构上改进了原始的…

JVET-AC0315:用于色度帧内预测的跨分量Merge模式

ECM采用了许多跨分量的预测(Cross-componentprediction,CCP)模式,包括跨分量包括跨分量线性模型(CCLM)、卷积跨分量模型(CCCM)和梯度线性模型(GLM)&#xff0…

软件太多?1 秒找到您想要的应用

您的手机页面是怎样的呢? 也许像这样,所有 APP 平铺在一起~ 亦或是这样,将所有 APP 分类整理好~ 在整理的过程中,我们免不了要进行 “拖拽” 。 平铺式的呈现方式,如果 APP 数量众多,我们免不了要进行搜索…

基于Java的题库管理系统的设计与实现

技术:Java、JSP等摘要:随着我国社会的进步,社会的各个领域的创新改革都在高速发展的信息时代下突显出来。在信息时代这个大的背景下,对软件开发的要求越来越高,对考试的管理更需要加强,所以迫使我们不得不对…

【设计模式之美 设计原则与思想:面向对象】12丨实战一(下):如何利用基于充血模型的DDD开发一个虚拟钱包系统?

上一节课,我们做了一些理论知识的铺垫性讲解,讲到了两种开发模式,基于贫血模型的传统开发模式,以及基于充血模型的 DDD 开发模式。今天,我们正式进入实战环节,看如何分别用这两种开发模式,设计实…

疫情开发,软件测试行情趋势是怎么样的?

如果说,2022年对于全世界来说,都是一场极大的挑战的话;那么,2023年绝对是机遇多多的一年。众所周知,随着疫情在全球范围内逐步得到控制,无论是国际还是国内的环境,都会呈现逐步回升的趋势&#…

每天一个摸鱼小技巧之「理解代码评审」

每个人的代码风格不同,在需要团队协作的项目里,如果没有统一的编程规范,那么会出现各式各样的代码,这对于团队成员来讲是个「灾难」。在需要对接协作模块时,要花费大量的时间去阅读代码,如果注释写的不明确…

观点分享 | 冲量在线联合创始人CTO陈浩栋:基于可信执行环境构建更安全的数据流通方案

2022年12月28日,由中国信息通信研究院(以下简称中国信通院)、中国通信标准化协会指导,隐私计算联盟、中国通信标准化协会大数据技术标准推进委员会联合主办的2022可信隐私计算峰会在北京召开,本次峰会的主题为“推进隐…

IO多路转接 —— poll和epoll

文章目录1. poll1.1 poll的函数接口1.2 poll的简单测试程序1.3 poll的优缺点分析2. epoll2.1 epoll的函数接口2.2 epoll的工作原理2.3 epoll的工作模式(LT,ET)2.4 epoll的简易服务器实现(默认是LT工作模式)前言: 接上文讲述的select,它有缺点&#xff0c…

一个UML的例子

一、需求分析 1.概念定义 需求分析,要明确以下4个概念的具体内容: 资源是指使用或产生的对象,如人、物料、信息、产品等。 目标是指希望资源处于什么样的状态。 过程是指被执行的活动,这些活动会改变资源的状态。 规则是指在某些…

2023-02-09 - 3 Elasticsearch基础操作

本章主要介绍ES的基础操作,具体包括索引、映射和文档的相关操作。其中,在文档操作中将分别介绍单条操作和批量操作。在生产实践中经常会通过程序对文档进行操作,因此在介绍文档操作时会分别介绍DSL请求形式和Java的高级REST编码形式。 1 索引…

VIF原理

文章目录一、VIF公式和原理对于R方一般回归模型皮尔逊相关系数中的方差VIF原理:一、VIF公式和原理 所谓VIF方法,计算难度并不高。在线性回归方法里,应用最广泛的就是最小二乘法(OLS),只不过我们对每个因子…

锁的优化机制了解嘛?请进!

点个关注,必回关 文章目录自旋锁:自适应锁:锁消除:锁粗化:偏向锁:轻量级锁:从JDK1.6版本之后,synchronized本身也在不断优化锁的机制,有些情况下他并不会是一个很重量级的…

Open AI登录,可以使用ChatGPT!

目录 第一步:准备好上网工具 1、确认自己的IP 二、登录 三、无法登录的问题 第一步:准备好上网工具 1、确认自己的IP 先查看自己的电脑的IP,使用https://www.ip138.com/,看看,然后就可以将自己电脑的IP改成国外的IP&#x…

Word处理控件Aspose.Words功能演示:使用 C++ 拆分 MS Word 文档

Aspose.Words 是一种高级Word文档处理API,用于执行各种文档管理和操作任务。API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word。此外,API支持所有流行的Word处理文件…

利用 ChatGPT 回答 R 相关问题

最近小编也尝试使用了 ChatGPT,下面给出一些知乎上常见 R 语言相关问题的回答。供大家参考: 目录 文章目录目录经典问题预测数据科学软件排名数据科学的 10 个常用 R 包R 语言入门书籍和网站推荐回答专业问题绘图绘制正负柱状图动态散点图构建 Shiny 程…

Java学习笔记-03(API阶段)

前言 目前我们看到的是Java基础部分的一个新的部分API,这是个啥,又能做啥呢? 其实可以概括成一句话:帮助我们站在巨人的肩膀上,实现更加高效的开发,那么我们来一探究竟吧~ API API(Application Programming Interface,应用程序接口)是一些预…

如何使用HTTP远程连接DOCKER?

/etc/systemd/system/docker.service.d/override.conf 写入文件 ##Add this to the file for the docker daemon to use different ExecStart parameters (more things can be added here) [Service] ExecStart ExecStart/usr/bin/dockerd默认情况下使用 systemd 时&#xff0…

报表生成器 FastReport .Net 用户指南 2023(十):Band的属性

FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案,使用FastReport .NET可以创建独立于应用程序的.NET报表,同时FastReport .Net支持中文、英语等14种语言,可以让你的产品保证真正的国际性。 FastReport.NET官方版…

HTTP协议基础知识(URL,请求响应格式,状态码,方法,cookie和session等)

目录 URL urlencode和urldecode http请求格式 http响应格式 http请求解析 http响应发送 http的方法 GET vs POST http的状态码 重定向 http常见报头属性 cookie和session URL 首先我们需要知道以下几点, 1.我们请求的图片,html,…