技术成神之路:设计模式(二十)装饰模式

论文地图合规求生指南:5分钟搞定标准地图服务转ArcGIS可用矢量文件 本文提供了一份论文地图合规求生指南,帮助非GIS专业背景的科研人员在5分钟内将标准地图服务的EPS文件转换为ArcGIS兼容的矢量文件。通过详细的工作流程和关键参数设置,确保地图完全符合国家规范,同时节省时间成本。重点关注标准地图服务的合规性和Shapefile转换技巧,适用于紧急情况下的论文地图处理。 阅读详情

相关文章:技术成神之路:二十三种设计模式(导航页)

介绍

装饰模式(Decorator Pattern)是一种结构型设计模式,它允许在不改变对象自身的情况下,动态地为对象添加额外的职责。这个模式通常用于增强或改变对象的功能。

1.定义


装饰模式通过创建一个装饰类,将功能动态地添加到被装饰类的实例中。装饰类与被装饰类实现相同的接口或继承相同的父类,这样装饰对象就可以取代被装饰对象。

2. 主要作用


  • 动态地给一个对象添加额外的职责,而不改变其原本的结构。
  • 提供了比继承更灵活的替代方案,通过组合而不是继承来扩展对象的功能。

3. 解决的问题


  • 需要在运行时为对象动态添加功能,而不修改对象本身。
  • 需要避免因类数量过多而导致的复杂性。
  • 需要在不影响其他对象的情况下扩展功能。

4. 模式原理


包含角色:

  1. 组件接口(Component): 定义了一个接口,用于所有具体组件和装饰器。
  2. 具体组件(ConcreteComponent): 实现了组件接口的具体类。
  3. 装饰器(Decorator): 实现了组件接口并持有一个组件的引用,用于在其方法中调用被装饰对象的方法。
  4. 具体装饰器(ConcreteDecorator): 继承自装饰器类,添加额外的功能。

UML类图:
在这里插入图片描述
代码示例:

// Component接口
public interface Coffee {
    double cost();
    String description();
}

// ConcreteComponent具体组件
public class SimpleCoffee implements Coffee {
    @Override
    public double cost() {
        return 5;
    }

    @Override
    public String description() {
        return "Simple Coffee";
    }
}

// Decorator装饰器
public abstract class CoffeeDecorator implements Coffee {
    protected Coffee decoratedCoffee;

    public CoffeeDecorator(Coffee coffee) {
        this.decoratedCoffee = coffee;
    }

    @Override
    public double cost() {
        return decoratedCoffee.cost();
    }

    @Override
    public String description() {
        return decoratedCoffee.description();
    }
}

// ConcreteDecorator具体装饰器
public class MilkDecorator extends CoffeeDecorator {
    public MilkDecorator(Coffee coffee) {
        super(coffee);
    }

    @Override
    public double cost() {
        return super.cost() + 1.5;
    }

    @Override
    public String description() {
        return super.description() + ", Milk";
    }
}

public class SugarDecorator extends CoffeeDecorator {
    public SugarDecorator(Coffee coffee) {
        super(coffee);
    }

    @Override
    public double cost() {
        return super.cost() + 0.5;
    }

    @Override
    public String description() {
        return super.description() + ", Sugar";
    }
}

调用

public class DecoratorPatternExample {
    public static void main(String[] args) {
        Coffee simpleCoffee = new SimpleCoffee();
        System.out.println(simpleCoffee.description() + " $" + simpleCoffee.cost());

        Coffee milkCoffee = new MilkDecorator(simpleCoffee);
        System.out.println(milkCoffee.description() + " $" + milkCoffee.cost());

        Coffee milkSugarCoffee = new SugarDecorator(milkCoffee);
        System.out.println(milkSugarCoffee.description() + " $" + milkSugarCoffee.cost());
    }
}

打印输出

Simple Coffee \$5.0
Simple Coffee, Milk \$6.5
Simple Coffee, Milk, Sugar \$7.0

上面示例,通过使用装饰者模式,程序能够灵活地添加新功能而不需要修改原有的 Coffee 实现。

装饰模式看似很简单,其实一点也不复杂😁,我相信看完一遍示例,再回头看下定义就会全懂了。

那么看似一个简单的设计模式,在我们开发中有哪些应用场景呢?下面举几个经典示例来加深下印象:

1.Java的输入/输出(I/O)库中使用了装饰者模式来增强流的功能。
例如,BufferedInputStream 和 DataInputStream 是装饰者,它们分别装饰 InputStream 类。通过这些装饰者,可以为基础流添加缓冲、数据格式等额外的功能。

emm… 上一篇文章,桥接模式也是举的这个例子,看来Java SDK使用的设计模式不少啊。

InputStream fileStream = new FileInputStream("file.txt");
BufferedInputStream bufferedStream = new BufferedInputStream(fileStream);
DataInputStream dataStream = new DataInputStream(bufferedStream);

2.Android View 组件
安卓开发的同学肯定都自定义过View吧,例如,创建一个自定义的TextView,通过扩展原始的TextView并添加一些额外的样式或功能。

public class CustomTextView extends TextView {
    public CustomTextView(Context context) {
        super(context);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 添加自定义绘制逻辑
    }
}

还有在 使用 Retrofit 网络请求时,可以自定义的拦截器,Spring 框架的 AOP通过代理(proxy)对象,可以在不改变原始对象的情况下,动态地添加横切关注点(如日志记录、事务管理等)等等… 这些都是装饰模式的经典案例。可能我们平时没注意,不知道它们用的是装饰模式,只要记住只要是 在运行时动态地添加行为和功能就可以认为是装饰者模式即可。

5. 优缺点


优点:

  • 灵活性:可以动态地添加或修改对象的功能,而无需修改原始类。
  • 扩展性:可以通过添加新的装饰器类来扩展功能,不需要改变现有代码。
  • 符合开闭原则:原有类不需要改变,新增功能通过装饰器实现。

缺点:

  • 复杂性:使用装饰模式会增加系统的复杂性,特别是在多个装饰器层叠使用时。
  • 调试困难:由于装饰者的层级结构,调试时可能不容易追踪到具体的功能实现。

6. 应用场景


  • 在图形界面中,可以为组件如按钮、文本框等添加滚动条、边框等装饰。
  • 在Java的IO系统中,装饰模式被广泛应用于各种输入流和输出流的实现中,如BufferedInputStream装饰FileInputStream。
  • 需要在不改变原有类的情况下,动态地为对象添加功能。

7. 总结


装饰模式是一种强大的设计模式,通过组合对象和装饰器的方式实现功能的动态扩展。它在实际开发中非常有用,能够有效地提高代码的灵活性和可维护性。虽然引入了额外的复杂性,但在许多情况下,这种复杂性是值得的,因为它使得系统可以更容易地适应变化和需求。

【WorkBuddy专栏51】Codex与WorkBuddy的底层基因——两条完全不同的AI智能体路线(上) 阅读详情

相关推荐

Unity开发微信小游戏,使用Addressables管理游戏资源(本地进行远程测试)

快速构建Unity微信小游戏 使用Addressables管理游戏资源 使用小皮助手在本地进行远程资源加载测试

the_vnas的博客 6390

技术成神之路:二十三种设计模式(导航页)

设计原则/模式 链接 面向对象的六大设计原则 技术成神之路:面向对象的六大设计原则 创建型模式 单例模式 建造者模式 原型模式 工厂方法模式 抽象工厂模式 行为型模式 策略模式 状态模式 责任链模式 观察者模式 备忘录模式 迭代器模式 模板方法模式 访问者模式 结构型模式 享元模式 中介者模式 代理模式 组合模式 适配器模式 桥接模式 装饰模式 外观

WriteBug001的博客 587

安装VMware,出现没有虚拟网络适配器的问题

安装VMware,出现没有虚拟网络适配器的问题

Young_Harry的博客 1万+

怎样设计一个好架构:八个评价维度、四层思考深度,以及 23 种设计模式各自解决什么问题

架构要解决的是变化、理解、故障和协作的成本。本文从耦合、可迁移、可适配、复杂度等八个维度讲怎么评价架构,讲维度之间怎么取舍、架构思考可以分几层,再用可编译的 C 代码过一遍 23 种设计模式。

weixin_52400878的博客 316

ABAP代码检查(Code Review)

1、SLIN 扩展程序检查 也可通过(SE38工具栏->检查-扩展程序检查) 进入 2、ATC 检查 通过<SE38菜单栏-检查-ABAP测试主控室> 或事物代码SCI, 支持自定义检查变式 SCI可以配置检查变式满足特殊需求,配置对象集用于批量检查 3、通过ABAP测试主控室实现统一管理,定期检查作业和监控功能(事务代码ATC) 参考 SLIN...

u012232542的博客 6063

Python自动化监控:实时捕捉LOF基金溢价套利机会并微信预警

本文详细介绍了如何使用Python构建一个自动化监控系统,实时捕捉LOF基金的溢价套利机会。通过AKShare获取基金数据,结合雪球API计算实时溢价率,并利用企业微信API实现微信推送预警,帮助投资者高效、自动地发现并抓住转瞬即逝的套利机会。

weixin_28327051的博客 522

工作流 vs 自主 Agent:5 种设计模式与 3 种建模方式详解

本文基于 Anthropic《Building Effective Agents》指南,系统梳理了AI应用中的两类核心架构:Workflow(编排式)与Agent(自主智能体)。强调“能画流程图就不上Agent”,提出从简单提示链到复杂自主决策的5种可组合工作流模式,并给出选型口诀与工程实践建议。核心观点:优先用确定性、可审计的Workflow,仅在任务路径未知时启用Agent,避免盲目复杂化。

分享大数据、java相关的技术 152

华为交换机与思科/华三设备LACP对接实战:手把手教你配置链路聚合

本文详细解析了华为交换机与思科、华三设备间的LACP链路聚合配置实战,涵盖核心原理、配置步骤及排错技巧。通过对比不同厂商的实现差异,提供可落地的跨厂商对接方案,助力企业网络工程师高效部署高可靠性链路聚合。

weixin_30836759的博客 422

设计模式 - 访问者模式

概述 访问者模式(Visitor Pattern)是一种行为型设计模式,它通过为对象结构中的每个元素添加一个访问操作,使得可以在不改变元素类的前提下定义作用于这些元素的新操作。

2601_96797912的博客 177

3D深度饼图的QT实现

首先,我们需要创建一个QT项目并创建一个窗口,用于显示我们的饼图。在QT Creator中,选择创建一个新的QT Widgets应用程序项目,并创建一个新的窗口类。在本文中,我将介绍如何使用QT实现一个3D深度饼图(Pie 3D)的可视化效果。在构造函数中,我们将创建一个饼图(QChartView)并设置饼图的数据。这是一个简单的示例,您可以根据需要自定义和扩展代码来创建更复杂的饼图。现在,我们已经完成了3D深度饼图的QT实现。您将看到一个具有相应数据的3D深度饼图显示在窗口中。3D深度饼图的QT实现。

CodeJolt的博客 277

我的python学习之路

Python 是一门功能强大且易于学习的编程语言,广泛应用于数据分析、人工智能、Web 开发、自动化等领域。以下是一个 Python 学习路径的总结,帮助你系统地掌握 Python 编程。

数据知道的博客 3万+

设计模式速查

本文梳理12个核心设计模式,涵盖创建型、结构型与行为型,提供简洁Java实现与面试要点。重点解析单例(静态内部类)、工厂(方法/抽象)、建造者(链式构建)等高频模式,强调代码可维护性与扩展性,附速记口诀与对比表格,助力开发与面试双提升。

ttlovet的博客 160

手把手教你学Simulink——基于Simulink的储能PCS(功率转换系统)离网V/f控制仿真示例

本文带你从零开始,在Simulink中硬核还原了一套完整的100kW 储能PCS离网V/f控制系统。通过引入:✅无PLL的自主角度生成机制(实现真正的“构网”能力)✅电压外环与电流内环的双闭环解耦架构(兼顾稳态精度与动态响应)✅黑启动软充电与有源阻尼等工程化手段(确保系统平滑建压与抗谐振)核心收获透彻理解了储能系统在无大电网支撑下的自主运行机理。掌握了从“跟网(Grid-Following)”向“构网(Grid-Forming)”跨越的控制算法核心差异。

MHD0815的博客 76

【第四部分:Agentic 智能体设计模式】17. Agent 路由模式详解:从意图识别到动态模型选择

本文介绍 Agent Routing(路由模式)的基本原理与工程实现,重点分析任务路由、模型路由、工具路由和专业 Agent 路由的区别及适用场景。结合 BaseMetas EKA 企业知识助手,介绍规则与模型混合路由、Java Router 实现、复合任务处理、低置信度兜底和误路由评估,并以 Jev 专用决策模型、动态模型选择及 Tool Search 等近期技术为例,说明如何在保证权限与执行安全的前提下,提高 Agent 任务分发的准确性和效率。

weixin_42258782的博客 625

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

设计模式与生活⑬:你坐几号线,谁来运营是另一回事

一到周五,小王的心情就会好一点。倒不是工作少了,而是想到这一天忙完,后面接着双休,心里就有盼头。地铁上,他抬头看标识,发现一件平时没留意的事:5 号线、10 号线常见的是“北京地铁”,4 号线却写着“京港地铁”。再想想,北京的机场也各有各的名字:首都机场、大兴机场。可在成都坐地铁,日常看到的统一称谓就是“成都地铁”。都是出行,名称和背后的主体并不完全一样。对乘客来说,常做的事还是那几样:查线路、进站、上车、到站下车。坐几号线是一条信息,谁来运营是另一条信息,不必揉成一团。同样是在北京坐地铁,线路和运营方并不

工一木子 218

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

设计模式概述

设计模式的意义、作用、分类等

lzy15192536135的博客 397

设计模式与生活⑩:地铁没变,你换了个状态

周二,没什么特别。小王照旧早起、吃早餐、坐地铁,到公司做日常开发。中午吃完饭,再去公司旁边遛一圈。普通的牛马的一天。地铁上倒有两个小片段。刚上去没座,他一只手扶杆,一只手刷手机。等他反应过来,已经坐过了一站。后来有了座,他靠着窗户,没一会儿睡着了。还是那班地铁,人已经从刷手机切到了睡觉还是小王,还是“列车到站”这件事,可他的反应已经不一样:刷手机时没留意,坐着清醒时会看站名,睡着后又听不见报站。今天聊的就是这个思路:**状态模式(State)——对象的内部状态变了,处理同一件事的方式也跟着变。

工一木子 174

设计模式与生活⑭:一栋楼,共用一份热

今天是立冬。天气预报说夜里有暴雪,白天最高也就 4 度。早上起来,屋里比外面强不了多少。窗玻璃上蒙着一层水汽,摸一把暖气片,凉的。物业群里发了通知:今天开始试供暖,暖气片会慢慢热起来,顶层记得排气,边户留意自家热不热。隔了会儿再摸,暖气片上热下凉,温温的,不烫手。再晚一点,整间屋子总算有了点热乎气。一天里最踏实的一件事,是知道这栋楼里不只自己一户在等热。热力站烧的是一锅水,顺着管网送到每家,各家只管拧自己那个阀门。试供暖第一天,暖气片温而不烫今天聊的。

工一木子 318

设计模式与生活⑪:地铁里被打扰,别总靠自己硬扛

周三的地铁上,小王本来想在脑子里过一遍今天要做的事。旁边一位大哥戴着耳机打电话。耳机里对方说什么,别人听不见;大哥自己的声音,却一句一句落在外面。声音不算大,也没有嚷,可就是不停。你刚把那件事想到一半,旁边又接上一句;刚想不去留意,下一句又钻进来了。最磨人的不是哪一句特别响,而是你拿不准这通电话还要多久。小王没说什么,站起来,往车厢另一头挪了挪。距离拉开,思绪才慢慢接了回去。耳机收住了电话另一端的声音,收不住说话人的声音这让他想起之前的另一次经历。

工一木子 154

Spring AI + GPT-5.5 + Ollama 配置教程:Base URL、超时与流式调用

由于不同 Spring AI、Spring Boot 小版本之间仍可能存在差异,创建项目时应检查 Spring Initializr、Spring AI BOM 和官方兼容矩阵,不要直接复制旧教程中的 Starter 名称和版本号。多人项目最好隔离不同客户端,并在脱敏前提下记录最终 URL、状态码、请求耗时、请求 ID 和模型 ID。Spring AI 接入模型 API,至少要同时确认 Starter、Base URL、请求路径、API Key、模型 ID、连接超时、读取超时和流式客户端这 8 项。

2601_95893075的博客 219

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 328

【JVM】对象内存布局

HotSpot JVM 中,Java 对象内存布局由对象头(12字节,含Mark Word与压缩Klass Pointer)、实例数据及对齐填充构成,总大小为8字节倍数。对象头支持锁状态动态复用,指针压缩使引用仅4字节,但堆超32GB时失效。实例字段按类型优先级重排序以减少间隙,最小对象大小为16字节。通过JOL工具可精准验证布局,理解锁机制、GC、伪共享等底层行为。

2301_79732484的博客 148

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 192

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 114

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 360

Decorator

TaskDecorator 是异步场景下"跨线程传递上下文"的标准方案,主要用于传递 MDC、用户信息、数据源路由等上下文数据,核心价值是让异步任务的日志链路不中断、业务上下文不丢失。TaskDecorator 是 Spring 提供的一个钩子接口,用于在异步任务执行前对 Runnable 进行包装,常用于跨线程传递上下文。如果你在项目中遇到具体的异步上下文传递问题,可以把代码贴出来,我帮你给出最合适的 Decorator 方案 👍。✅ 核心能力:在线程切换时,把"父线程的上下文"搬到"子线程"

wlwork66的博客 102

JDK 下载安装:装完 Java 提示「不是内部或外部命令」?环境变量没配

JDK 是写 Java 程序必须装的东西。它包含运行 Java 的虚拟机(JRE)和编译 Java 的编译器(javac)——装了它,能跑、.java文件能编译成可执行程序。免费,学习和小规模生产都不花钱。

科小怪的博客 623
上一篇: 技术成神之路:设计模式(十九)桥接模式
下一篇: C++基础
_蓝橙
博客等级 码龄7年 1179粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值