装饰模式-Decorator
名称:
装饰模式(Decorator Pattern)-对象结构型模式
问题:
The decorator pattern can be used to extend (decorate) the functionality of a certain object statically, or in some cases at run-time, independently of other instances of the same class, provided some groundwork is done at design time. This is achieved by designing a new decorator class that wraps the original class.
This pattern is designed so that multiple decorators can be stacked on top of each other, each time adding a new functionality to the overridden method(s).
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator相比生成子类更加灵活。
适用性:
-在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
-处理那些可以撤销的职责。
-当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
协作:
Decorator将请求转发给它的Component对象,并有可能在转发请求前后执行一些附加的动作。
优点和缺点:
1、比静态继承更灵活。
2、避免在层次结构高层的类有太多的特征。
3、Decorator与它的Component不一样。
4、有许多小对象。
解决方案:
1、 模式的参与者
1、Component
-定义一个对象接口,可以给这些对象动态地添加职责。
2、ConcreteComponent
-定义一个对象,可以给这个对象添加一些职责。
3、Decorator
-维持一个指向Component对象的指针,并定义一个于Component接口一致的接口。
4、ConcreteDecorator
-向组件添加职责。
2.实现方式
interface Component { public void operation(); }
class ConcreteComponent implements Component { public void operation() { } }
class Decorator implements Component { private Component component; public Decorator(Component component) { this.component=component; } public void operation() { component.operation(); } }
class ConcreteDecorator extends Decorator { public ConcreteDecorator(Component component) { super(component); } public void operation() { super.operation(); decoratorFunction(); } public void decoratorFunction() { } }
public class DecoratorPattern { public static void main(String[] args) { Component p=new ConcreteComponent(); p.operation(); Component d=new ConcreteDecorator(p); d.operation(); } }
装饰模式在java中的最著名的应用: Java I/O 标准库。
参考资料
《设计模式:可复用面向对象软件的基础》
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具