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

Java设计模式之装饰器模式详细讲解和案例示范 抽象组件(Component):定义一个接口,供具体组件和装饰器继承。具体组件(ConcreteComponent):实现抽象组件接口,代表要装饰的原始对象。装饰器(Decorator):持有一个抽象组件的引用,并实现抽象组件接口。具体装饰器(ConcreteDecorator):继承装饰器,并向其添加新的功能。这种模式的核心思想是将功能附加到对象,而不是通过子类扩展。Spring框架是Java开发中最为流行的框架之一,它通过各种设计模式的运用来实现高扩展性和灵活性。 阅读详情

装饰模式 (Decorator Pattern)

装饰模式是一种结构型设计模式,它的作用是动态地为对象添加额外的职责,而不修改其代码结构。装饰模式通过创建装饰类,将核心功能与附加功能分离,使得代码更灵活,更具扩展性。


1. 装饰模式的组成

装饰模式包含以下角色:

  • Component(抽象组件): 定义对象的通用接口,可以动态地为该接口添加职责。
  • ConcreteComponent(具体组件): 组件的具体实现,是最基础的对象。
  • Decorator(装饰器): 持有一个 Component 的引用,并定义一个与 Component 一致的接口。
  • ConcreteDecorator(具体装饰器): 实现具体的装饰功能,同时调用组件的核心功能。

2. 装饰模式的优点

  1. 功能扩展灵活: 可以动态地为对象添加功能,而不需要修改原有类。
  2. 遵循开闭原则: 增加功能时,无需修改已有代码,只需增加新的装饰器类。
  3. 细粒度控制: 每个装饰器只负责一个特定的功能,职责单一。

3. 装饰模式的缺点

  1. 增加复杂性: 每个装饰器都是一个新的类,可能导致类数量增加。
  2. 调试困难: 如果多个装饰器嵌套使用,可能会导致调试和排错复杂化。

4. 装饰模式的实现

场景示例:给文本添加装饰功能

需求: 假设我们有一个文本处理组件,支持基本的文本输出功能。现在需要为它动态添加功能,比如加粗、斜体、添加颜色等。


1) 定义抽象组件

抽象组件定义通用接口,表示所有文本处理组件的公共行为。

// 抽象组件
public interface Text {
    String render(); // 渲染文本
}

2) 实现具体组件

具体组件实现基本的文本渲染功能。

// 具体组件
public class PlainText implements Text {
    private String content;

    public PlainText(String content) {
        this.content = content;
    }

    @Override
    public String render() {
        return content;
    }
}

3) 定义装饰器

装饰器类持有一个 Text 的引用,负责为组件动态添加功能。

// 抽象装饰器
public abstract class TextDecorator implements Text {
    protected Text text;

    public TextDecorator(Text text) {
        this.text = text;
    }

    @Override
    public String render() {
        return text.render();
    }
}

4) 实现具体装饰器

具体装饰器负责添加不同的功能,例如加粗和斜体。

// 加粗装饰器
public class BoldText extends TextDecorator {
    public BoldText(Text text) {
        super(text);
    }

    @Override
    public String render() {
        return "<b>" + super.render() + "</b>";
    }
}

// 斜体装饰器
public class ItalicText extends TextDecorator {
    public ItalicText(Text text) {
        super(text);
    }

    @Override
    public String render() {
        return "<i>" + super.render() + "</i>";
    }
}

// 颜色装饰器
public class ColoredText extends TextDecorator {
    private String color;

    public ColoredText(Text text, String color) {
        super(text);
        this.color = color;
    }

    @Override
    public String render() {
        return "<span style='color:" + color + "'>" + super.render() + "</span>";
    }
}

5) 客户端代码

客户端可以自由组合不同的装饰器来扩展功能。

public class Client {
    public static void main(String[] args) {
        // 基础文本
        Text text = new PlainText("Hello, World!");

        // 添加加粗功能
        Text boldText = new BoldText(text);

        // 添加斜体功能
        Text italicText = new ItalicText(boldText);

        // 添加颜色功能
        Text coloredText = new ColoredText(italicText, "red");

        // 渲染最终文本
        System.out.println(coloredText.render());
    }
}

运行结果:
<span style='color:red'><i><b>Hello, World!</b></i></span>

最终输出的文本是带有颜色、加粗和斜体的 HTML 格式。


5. 装饰模式的应用场景

  1. 动态扩展功能:
    需要为对象动态添加功能,并且可能在运行时组合多种功能。

  2. 代替继承:
    使用装饰模式可以避免通过继承实现功能扩展,减少类的数量。

  3. 需要根据不同需求组合功能:
    比如 GUI 系统中的组件,可能需要动态添加滚动条、边框、阴影等功能。


6. Java 中的典型应用

  1. java.io 包中的装饰器模式

    • InputStream 和 OutputStream 类的子类:
      • BufferedInputStream
      • DataInputStream
      • FilterInputStream
    • 通过装饰器动态扩展流的功能:
      InputStream input = new FileInputStream("file.txt");
      InputStream bufferedInput = new BufferedInputStream(input);
      
  2. Java Swing

    • Java Swing 的组件可以动态添加边框等效果:
      JTextField textField = new JTextField();
      textField.setBorder(BorderFactory.createLineBorder(Color.BLACK));
      

7. 装饰模式与其他模式的比较

模式主要用途与装饰模式的区别
代理模式控制对象的访问代理模式不改变对象的功能,装饰模式增加新功能。
适配器模式接口不兼容的对象协同工作适配器模式主要解决接口问题,装饰模式动态增强功能。
桥接模式分离抽象和实现桥接模式关注结构设计,装饰模式关注动态增强功能。

8. 总结

装饰模式是一种灵活、优雅的设计模式,它通过组合的方式动态为对象添加功能,而不修改原有代码。装饰模式遵循开闭原则,是功能扩展需求中的理想选择。

在实际开发中,装饰模式广泛应用于流处理、GUI 系统以及其他需要动态功能扩展的场景。它是一种高效且值得掌握的设计模式。

Linux下OpenFire+Spark即时通讯环境搭建全攻略(含证书错误解决方案) 本文提供了一份详尽的Linux环境下OpenFire服务器与Spark客户端即时通讯系统的搭建与配置全攻略。内容涵盖从环境规划、服务端部署、数据库配置到客户端连接的全流程,并重点解决了Spark连接时常见的证书验证错误问题,为企业构建私有化、高可用的XMPP通讯平台提供了实战指导。 阅读详情

相关推荐

使用JAVA 的 POI 库 将DOC文件转为DOCX文件

java使用POI库,将doc文件转为docx文件

qq_45808266的博客 5702

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

简要叙述java设计模式装饰器模式,并进行代码的示例

tang_seven的博客 4925

企业级AI Agent平台建设方案

本报告将深入剖析构成一个顶级AI Agent平台的各个功能层面,为构建者提供一份全面的战略蓝图。

分享AI和大数据领域的知识和研究 1582

【JAVA设计模式】装饰模式

装饰者模式

小朋友的博客 737

Mimics 21.0软件学习笔记(一)基本操作

Materialise Mimics 21.0打开工程窗口化Thresholding 二值化Region growing区域增长创建一个3D表示,并显示股骨头从髋臼中区分出来,并单独为股骨头建立3D模型 打开工程 Opening the Project 窗口化 Windowing 二值化 Thresholding 区域增长 Region Growing 建立 3D 表示 Creating a 3D representation 显示 3D 表示 Displaying a 3D representation

qq_35495464的博客 4万+

Sentinel2 哨兵2数据下载方法(USGS)-史上最全讲解

本文讲述了从USGS官网下载Sentinel2的方法。主要包括USGS官网的注册和下载流程,以及选定研究区中所出现的问题、解决办法。

xiatiandexia123的博客 6万+

Java设计模式——装饰模式

装饰(Decorator)模式是一种结构型设计模式,它允许在运行时动态地给一个对象添加新的职责或行为,而无需修改原有的类结构。装饰模式的核心思想是在不改变原有对象的基础上,通过组合的方式将新的职责附加到对象上。装饰模式用于动态地给一个对象增加一些额外的职责,就增加对象功 能来说,装饰模式比生成子类实现更为灵活。它是一种对象结构型模 式。装饰模式包含四个角色:抽象构件定义了对象的接口,可以给这些对 象动态增加职责(方法);

weixin_43841461的博客 1735

电气比例阀采用外置传感器和PID控制器实现化学机械抛光(CMP)的超高精度压力控制

摘要:为大幅度提高现有CMP工艺设备中压力控制的稳定性,在现有电气比例阀这种单回路PID压力调节技术的基础上,本文提出了升级改造方案,即采用串级控制法(双回路PID控制,也称级联控制),通过在现有电气比例阀回路中增加更高精度的压力传感器和PID控制器,可以将研磨抛光压力的稳定性提高一个数量级,从1~2%的稳定性提升到0.1~0.2%。

Shanghai_Eyoung的博客 1291

Java设计模式—装饰模式

装饰模式是一种比较常见的模式。 定义为:动态的给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更加灵活。 装饰模式的通用类图如下: 装饰模式的构成: 1)抽象构件(Component):是一个接口或者是抽象类,就是定义我们最核心的对象,也就是原始的对象。 ******在装饰模式中必须有一个最基本,最核心,最原始的接口或者抽象类来充当Com...

weixin_34162228的博客 530

单细胞分析R包monocle3服务器安装教程

由于centos7系统yum只能安装到低版本gdal,而monocle3依赖包需要 gdal>2 版本,从gdal官网下载2.4.4版本编译安装。monocle3的安装是通过cole-trapnell-lab安装的,该包挂在github上,需要通过github先安装leidenbase包,需要提前安装devtools包下载工具。接着利用BiocManager安装相应的依赖包,由于这些包的特殊性,所以不要切换到国内Bio_Mirror镜像,否则会找不到,如果一次不成功,缺啥补啥即可。运行 ldconfig。

qq_36608036的博客 1万+

SAP Business Technology Platform 支持的技术栈

SAP Business Technology Platform(简称 BTP)是 SAP 提供的一个综合技术平台,旨在帮助企业实现业务转型和创新。BTP 融合了数据库管理、应用开发、集成、分析和智能技术,为企业提供从基础架构到端到端应用的全面服务。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1567

JAVA设计模式之 装饰模式【Decorator Pattern】

一、概述 动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。装饰模式是一种对象结构型模式。装饰模式是一种用于替代继承的技术,使用对象之间的关联关系取代类之间的继承关系。在装饰模式中引入了装饰类,在装饰类中既可以调用待装饰的原有类的方法,还可以增加新的方法,以扩充原有类的功能。二、适用场景 装饰原有对象、在不改变原有对象的情况下扩展增强新功能/新特征.。当不能

小吕丶Code阶区 3369

Oracle EBS R12 AR 标准发票 核心表结构

​ Oracle EBS R12 AR 标准发票 核心表结构 聚焦手动标准发票 (Standard Invoice),按头→行→分配→税→收款计划→会计分录→历史分层,标注主键、外键、关键字段、业务含义,同时说明表间关联关系,适配开发 / 运维 / 数据核对场景。 一、主数据层(发票头 + 行,核心业务表) 1. RA_CUSTOMER_TRX_ALL 【发票头表】 作用:存储整张发票头部信息,一张发票对应一条记录,AR 发票主表。 主键:CUSTOMER_TRX_ID (唯一 ID,系统内部键) 业

金牌架构师 280

设计模式之七—装饰模式(Decorator Pattern)

装饰模式是一种结构型设计模式,它动态地将责任附加到对象上。装饰模式提供了比继承更有弹性的替代方案,用于扩展对象的功能。装饰模式提供了一种灵活的替代继承的方式,通过组合对象来扩展功能。需要动态、透明地给对象添加职责需要避免使用继承导致的类爆炸问题需要遵循开闭原则,在不修改现有代码的情况下扩展功能在Java中,装饰模式被广泛应用于I/O流处理、GUI组件装饰等场景。正确使用装饰模式可以提高代码的灵活性和可维护性,但也需要注意避免过度使用导致的系统复杂性增加。

技术交流,一起进步 677

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

始的对象,如上面的成绩单。注意:在装饰模式中,必然有一个最基本、最核心、最原始的接口或抽象类充当Component 抽象构件。● ConcreteComponent 具体构件ConcreteComponent 是最核心、最原始、最基本的接口或抽象类的实现,你要装饰的就是它。● Decorator 装饰角色一般是一个抽象类,做什么用呢?实现接口或者抽象方法,它里面可不一定有抽象的方法呀,在它的属性里必然有一个 private 变量指向 Component 抽象构件。● 具体装饰角色。

2401_84557521的博客 931

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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

57524ds5gds

阿Q的小窝 706

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

装饰模式(Decorator Pattern)

装饰模式(Decorator Pattern)是一种结构型设计模式,它允许通过将对象包装在装饰器类的实例中来动态地添加新的行为和责任。这种模式可以在不修改现有代码的情况下,灵活地扩展对象的功能。

weixin_40026739的博客 1347

装饰模式-Decorator Pattern

装饰模式的定义与特点 装饰(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。 装饰(Decorator)模式的主要优点有: 采用装饰模式扩展对象的功能比采用继承方式更加灵活。 可以设计出多个不同的具体装饰类,创造出多个不同行为的组合。 其主要缺点是:装饰模式增加了许多子类,如果过度使用会使程序变得很...

心猿意碼 6416

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

装饰模式定义 官方定义:Attach additional responsibilities to an object dynamically keeping the same interface. Decorators provide a flexible alternative to subclassing for extending functionally. 动态地给一个对象添加一些...

程铭程铭你快成名的博客 3441

装饰模式(Decorator pattern)

装饰模式(Decorator pattern): 又名包装模式(Wrapper pattern), 它以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。 装饰模式以对客户透明的方式动态的给一个对象附加上更多的责任。换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。 装饰模式可以在不创造更多子类的情况下,将对象的功能加以扩展。 装饰模式 把客户端的调用委派到被装饰类...

dhxzfdv7839214的博客 168

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

Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible alternative to subclassing for extending functionality.(动态地给一个对象添加一些额外的职责。就增加功能来说,装...

境里婆娑 263

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

1、装饰者模式 UML图 Component(组件) :组件接口 或 抽象类 定义了 组件实现类 和 装饰器实现类 的行为。 ConcreteComponent(组件实现类) :组件实现类 实现了 Component 接口 或 抽象类。通常情况下,具体组件实现类就是被装饰器装饰的原始对象,该类提供了 Component 接口中定义的最基本的功能,其他高级功能或后序添加的新功能,都是通过...

猎人在吃肉 1970

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

装饰模式(DecoratorPattern)的模式介绍、应用场景、优缺点以及代码示例

weixin_70044963的博客 718

【编码魔法师系列_结构型4】装饰模式(Decorator Pattern)

学会设计模式,你就可以像拥有魔法一样,在开发过程中解决一些复杂的问题。设计模式是由经验丰富的开发者们(GoF)凝聚出来的最佳实践,可以提高代码的可读性、可维护性和可重用性,从而让我们的开发效率更高。通过不断的练习和实践,掌握其中的奥妙,选择合适的设计模式,能为我们的项目增加一丝神奇的魔力。

小名同学 12万+

2.4 装饰模式(Decorator Pattern)

装饰模式(Decorator Pattern)是一种结构型设计模式,允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一种替代方案。装饰模式通过创建一个包装对象,也就是装饰器来包裹真实的对象。装饰模式提供了一种灵活而强大的方式来扩展对象的功能,而无需修改其原始代码。它使得我们可以动态地添加或删除对象的职责,是一种优雅而高效的设计解决方案。

qq_28791753的博客 1578

设计模式之装饰模式Decorator Pattern-Java版

一、定义 《Head First Design Patterns》:The Decorator Pattern attaches additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality. 即:装饰模式将额外的责任动态地附加到一个对象上。装饰器为扩展功能提供了一种灵活的子类化可选方法。 简单

qianmojl的博客 272
上一篇: Java设计模式 九 桥接模式 (Bridge Pattern)
下一篇: Java设计模式 十一 外观模式 (Facade Pattern)
十方来财
十方来财 新星创作者: 编程框架技术领域 新星创作者: 编程框架技术领域
博客等级 码龄14年 8357粉丝 346原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十方来财

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值