设计模式结构型——装饰器模式 📅 发布时间:2026/8/22 12:06:32 👁 浏览次数: 目录什么是装饰器模式装饰器模式的实现装饰器模式角色装饰器模式类图装饰器模式代码实现装饰器模式的特点优点缺点注意事项应用场景什么是装饰器模式装饰器模式Decorator Pattern又称为包装模式(Wrapper Pattern)是指在不改变原有对象的基础之上将功能附加到对象上提供了比继承更有弹性的替代方案(扩展原有对象的功能)即允许向一个现有的对象添加新的功能属于结构型模式。装饰器模式的核心是功能扩展使用装饰器模式可以透明且动态地扩展类的功能。装饰器模式通过将对象包装在装饰器类中以便动态地修改其行为。其创建了一个装饰类用来包装原有的类并在保持类方法签名完整性的前提下提供了额外的功能。动态地给一个对象添加一些额外的职责。就增加功能来说装饰器模式相比生成子类更为灵活。装饰器模式的实现装饰器模式角色抽象组件Component可以是一个接口或者抽象类其充当被装饰类的原始对象规定了被装饰对象或类的行为具体组件ConcreteComponent实现/继承抽象组件的一个具体对象即被装饰对象通过装饰角色为其添加一些职责抽象装饰器Decorator实现/继承抽象组件通用的装饰具体组件的装饰器其内部必然有一个属性指向抽象组件其实现一般是一个抽象类主要是为了让其子类按照其构造形式传入一个抽象组件这是强制的通用行为若系统中逻辑单一并不需要实现许多装饰器那么我们可以直接省略该类可直接实现一个具体装饰器具体装饰器ConcreteDecorator抽象装饰器的具体实现类并给具体构件对象添加附加的责任一般为其特有的功能理论上每个具体装饰器都扩展了抽象组件对象的一种功能装饰器模式类图装饰器模式代码实现抽象组件代码package com.common.demo.pattern.decorator; /** * author Evan Walker 昂焱数据: https://www.ayshuju.com * version 1.0 * desc 手机接口类,即抽象者模式中的抽象组件类 * date 2023/07/19 16:03:54 */ public interface Phone { /** * 打印方法 */ void print(); }具体组件代码package com.common.demo.pattern.decorator; /** * author Evan Walker 昂焱数据: https://www.ayshuju.com * version 1.0 * desc 华为手机 即装饰着模式中的具体组件类 * date 2023/07/19 16:04:54 */ public class HuaweiPhone implements Phone{ Override public void print() { System.out.print(我是一部华为手机); } } package com.common.demo.pattern.decorator; /** * author Evan Walker 昂焱数据: https://www.ayshuju.com * version 1.0 * desc 苹果手机 即装饰着模式中的具体组件类 * date 2023/07/19 16:11:15 */ public class ApplePhone implements Phone { Override public void print() { System.out.print(我是一部苹果手机); } }抽象装饰器代码package com.common.demo.pattern.decorator; /** * author Evan Walker 昂焱数据: https://www.ayshuju.com * version 1.0 * desc 装饰角色 * date 2023/07/19 16:07:14 */ public abstract class PhoneDecorator implements Phone{ //该装饰对象装饰到的Phone组件实体对象 protected Phone phone; public PhoneDecorator(Phone phone) { this.phone phone; } Override public void print() { phone.print(); } }具体装饰器代码package com.common.demo.pattern.decorator; /** * author Evan Walker 昂焱数据: https://www.ayshuju.com * version 1.0 * desc 挂件具体装饰者 * date 2023/07/19 16:13:57 */ public class Accessories extends PhoneDecorator{ public Accessories(Phone phone) { super(phone); } Override public void print() { phone.print(); //添加行为 addAccessories(); } public void addAccessories() { System.out.println(现在有漂亮的挂件了); } } package com.common.demo.pattern.decorator; /** * author Evan Walker 昂焱数据: https://www.ayshuju.com * version 1.0 * desc 贴膜具体装饰者 * date 2023/07/19 16:13:28 */ public class Sticker extends PhoneDecorator { public Sticker(Phone phone) { super(phone); } Override public void print() { phone.print(); //添加行为 addSticker(); } public void addSticker() { System.out.println(现在有贴膜了); } }测试代码package com.common.demo.pattern.decorator; /** * author Evan Walker 昂焱数据: https://www.ayshuju.com * version 1.0 * desc * date 2023/07/19 16:22:09 */ public class Test { public static void main(String[] args) { Phone phone new HuaweiPhone(); PhoneDecorator huaweiAccessories new Accessories(new HuaweiPhone()); PhoneDecorator appleSticker new Sticker(new ApplePhone()); phone.print(); System.out.println(); huaweiAccessories.print(); appleSticker.print(); } }测试结果装饰器模式的特点优点装饰器模式与继承关系的目的都是要扩展对象的功能但其可以提供比继承更多的灵活性在不改变原有对象的情况下动态的给一个对象扩展功能即插即用通过使用不同的具体装饰类以及这些装饰类的排列组合可创造出很多不同行为的组合装饰器模式完全遵守开闭原则缺点比继承更加灵活机动的特性意味着会出现更多的代码、更多的类增加程序的复杂性装饰模式是针对抽象组件Component类型编程。当针对具体组件编程时应思考当前应用架构装饰者是否合适。当然也可以改变Component接口增加新的公开的行为实现“半透明”的装饰者模式注意事项可代替继承应用场景扩展一个类的功能动态增加功能动态撤销