当前位置:首页 > 技术 > 正文内容

装饰器模式详解:动态扩展对象功能

访客 技术 2026年6月19日 1
类图示例

掌握设计模式能显著提升系统架构能力,通过标准化解决方案应对复杂场景。装饰器模式作为GoF提出的经典结构型模式,通过组合方式实现功能扩展,在保持原有行为基础上动态增加新职责。

核心特征:
- 通过组合而非继承实现功能增强
- 保持被装饰对象原有接口不变
- 支持多层嵌套装饰

应用场景:
1. 需要动态添加职责的场景
2. 不希望修改原有类的封闭系统
3. 实现类似AOP的横切关注点管理

实现示例:
以智能设备功能扩展为例,展示如何通过装饰器模式实现功能叠加:


// 基础设备接口
public interface Device {
    void operate();
}

// 基础设备实现
public class BasicDevice implements Device {
    @Override
    public void operate() {
        System.out.println("基础功能:");
        System.out.println("通话");
        System.out.println("短信");
    }
}

// 功能扩展装饰器
public interface DeviceDecorator extends Device {
    void enhance();
}

// 智能设备装饰器
public class SmartDevice implements DeviceDecorator {
    private Device device;
    
    public SmartDevice(Device device) {
        this.device = device;
    }
    
    @Override
    public void operate() {
        device.operate();
    }
    
    @Override
    public void enhance() {
        device.operate();
        System.out.println("智能增强功能:");
        System.out.println("摄像");
        System.out.println("NFC");
    }
}

// 特色设备装饰器
public class FeatureDevice implements DeviceDecorator {
    private Device device;
    
    public FeatureDevice(Device device) {
        this.device = device;
    }
    
    @Override
    public void operate() {
        device.operate();
    }
    
    @Override
    public void enhance() {
        device.operate();
        System.out.println("特色功能:");
        System.out.println("摄像");
        System.out.println("NFC");
        System.out.println("红外控制");
    }
}

测试验证:


public class Test {
    public static void main(String[] args) {
        System.out.println("===智能设备测试===");
        new SmartDevice(new BasicDevice()).enhance();
        System.out.println("===特色设备测试===");
        new FeatureDevice(new BasicDevice()).enhance();
    }
}

运行结果:


===智能设备测试===
基础功能:
通话
短信
智能增强功能:
摄像
NFC
===特色设备测试===
基础功能:
通话
短信
特色功能:
摄像
NFC
红外控制

模式分类:
根据装饰器是否添加新功能可分为:

  • 透明装饰模式:仅重写原有方法,如Java I/O中的BufferedInputStream
  • 半透明装饰模式:新增功能方法,如DataInputStream的readInt()方法

优势分析:
- 避免类爆炸问题
- 支持运行时动态组合
- 保持开放封闭原则
- 提升代码可维护性

注意事项:
- 装饰器层级不宜过深
- 需保持接口一致性
- 注意方法调用顺序

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。