Java设计模式之(七)——装饰器模式
1、什么是装饰器模式?
Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible
alternative to subclassing for extending functionality.
装饰器模式(Decorator Pattern):动态的给一个对象添加额外的职责,就增加功能来说, 装饰模式相比生成子类更为灵活。
说人话:一般的,我们为了扩展一个类经常使用继承方式实现,随着扩展功能的增多,子类会很膨胀。这时候期望在不改变类对象及其类定义的情况下,为对象添加额外功能,这就是装饰器模式。
2、装饰器模式定义

①、Component抽象构件
Component是一个接口或者是抽象类, 就是定义我们最核心的对象, 也就是最原始的对象。
②、ConcreteComponent 具体构件
ConcreteComponent是最核心、 最原始、 最基本的接口或抽象类的实现, 你要装饰的就是它。
③、Decorator装饰角色
一般是一个抽象类, 实现接口或者抽象方法, 它里面可不一定有抽象的方法, 在它的属性里必然有一个private变量指向Component抽象构件。
④、ConcreteDecorator 具体装饰角色
ConcreteDecoratorA和ConcreteDecoratorB是两个具体的装饰类, 你要把你最核心的、 最原始的、 最基本的东西装饰成其他东西
3、装饰器模式通用代码实现
/** * 抽象构件 */ public abstract class Component { public abstract void operator(); }
/** * 具体构件 */ public class ConcreteComponent extends Component{ @Override public void operator() { System.out.println("doSomething"); } }
/** * 抽象装饰者 */ public abstract class Decorator extends Component{ private Component component; public Decorator(Component component){ this.component = component; } // 委托给被修饰者执行 @Override public void operator() { this.component.operator(); } }
public class ConcreteDecorator1 extends Decorator{ // 定义被修饰者 public ConcreteDecorator1(Component component){ super(component); } // 定义自己的修饰方法 public void method1(){ System.out.println("修饰方法 method1"); } @Override public void operator() { this.method1(); super.operator(); } }
public class ConcreteDecorator2 extends Decorator{ // 定义被修饰者 public ConcreteDecorator2(Component component){ super(component); } // 定义自己的修饰方法 public void method2(){ System.out.println("修饰方法 method2"); } @Override public void operator() { super.operator(); this.method2(); } }
客户端测试:
public class DecoratorClient { public static void main(String[] args) { Component component = new ConcreteComponent(); // 第一次修饰 component = new ConcreteDecorator1(component); // 第二次修饰 component = new ConcreteDecorator2(component); // 修饰后运行 component.operator(); } }
打印结果:
4、装饰器模式优点
①、装饰模式可以动态地扩展一个实现类的功能。
②、装饰类和被装饰类可以独立发展, 而不会相互耦合。 换句话说, Component类无须知道Decorator类, Decorator类是从外部来扩展Component类的功能, 而Decorator也不用知道具体的构件。
③、装饰模式是继承关系的一个替代方案。 我们看装饰类Decorator, 不管装饰多少层, 返回的对象还是Component, 实现的还是is-a的关系
5、装饰器模式应用场景
①、需要扩展一个类的功能, 或给一个类增加附加功能。
②、需要动态地给一个对象增加功能, 这些功能可以再动态地撤销。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
2018-11-24 JDK1.8源码(十)——java.util.LinkedHashSet类
2017-11-24 Linux系列教程(二十四)——Linux的系统管理