装饰器模式(Decorator)

装饰器模式(Decorator Pattern)

是一种结构型设计模式,它允许你动态地给一个对象添加一些额外的职责(即增加其功能),就增加功能来说,装饰器模式相比生成子类更为灵活。装饰器模式是一种对象结构型模式,在其结构图中含有一个作为抽象构件(Component)角色的接口和多个实现了该接口的抽象装饰类(Decorator)角色。抽象装饰类给原有业务类添加职责(方法或者属性),并且含有指向抽象构件角色的引用。

模式结构

装饰器模式主要包含以下角色:

  1. 抽象构件(Component)角色:它是具体构件和抽象装饰类的共同父类,声明了在具体构件中实现的业务方法,它的引入可以使客户端以一致的方式处理未被装饰的对象以及装饰之后的对象,实现客户端的透明操作。
  2. 具体构件(ConcreteComponent)角色:它是抽象构件角色的子类,用于定义具体的构件对象,实现了在抽象构件中声明的方法,装饰器可以为它增加额外的职责(方法)。
  3. 抽象装饰(Decorator)角色:它也是抽象构件角色的子类,用于给具体构件增加职责,但是具体职责在抽象装饰中并不实现。它维护一个指向抽象构件角色的引用,在抽象装饰角色的子类中可以通过该引用来调用装饰之前构件对象的方法,并通过其子类扩展该方法,以达到增加或增强功能的目的。
  4. 具体装饰(ConcreteDecorator)角色:它是抽象装饰角色的子类,负责向构件添加新的职责。每一个具体装饰类都添加了一些额外的职责,同时它记住并包含它的所装饰的对象的引用。

工作原理

装饰器模式的工作原理是动态地将责任附加到对象上。若要扩展一个对象的功能,装饰器提供了一个比继承更有弹性的替代方案。装饰器模式通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。

优点

  1. 透明性:客户端可以一致地使用构件对象,而无需关心它是否被装饰过,以及被装饰了多少次。
  2. 灵活性:通过灵活使用不同的装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。
  3. 扩展性:如果需要添加新的功能,只需要增加一个新的具体装饰类即可,无需修改原有代码。

缺点

  • 多层装饰比较复杂:如果多层装饰的话,会导致系统设计中出现许多小类,这些类的区别只在于它们之间相互连接的方式有所不同。
  • 可能会增加性能开销:因为每次添加装饰时,都需要创建一个新的装饰对象,并存储其引用,这可能会增加一些性能开销。

示例代码(Java)

以下是一个简单的装饰器模式的示例代码:

java
// 抽象构件角色  
interface Component {  
    void operation();  
}  
  
// 具体构件角色  
class ConcreteComponent implements Component {  
    @Override  
    public void operation() {  
        System.out.println("执行具体构件角色的操作");  
    }  
}  
  
// 抽象装饰角色  
abstract class Decorator implements Component {  
    protected Component component;  
  
    public Decorator(Component component) {  
        this.component = component;  
    }  
  
    @Override  
    public void operation() {  
        if (component != null) {  
            component.operation();  
        }  
    }  
}  
  
// 具体装饰角色  
class ConcreteDecoratorA extends Decorator {  
    public ConcreteDecoratorA(Component component) {  
        super(component);  
    }  
  
    @Override  
    public void operation() {  
        super.operation();  
        addedFunctionA();  
    }  
  
    public void addedFunctionA() {  
        System.out.println("为构件对象添加功能A");  
    }  
}  
  
// 另一个具体装饰角色  
class ConcreteDecoratorB extends Decorator {  
    public ConcreteDecoratorB(Component component) {  
        super(component);  
    }  
  
    @Override  
    public void operation() {  
        super.operation();  
        addedFunctionB();  
    }  
  
    public void addedFunctionB() {  
        System.out.println("为构件对象添加功能B");  
    }  
}  
  
// 客户端代码  
public class Client {  
    public static void main(String[] args) {  
        Component component = new ConcreteComponent();  
  
        // 使用装饰器A  
        ConcreteDecoratorA decoratorA = new ConcreteDecoratorA(component);  
        decoratorA.operation();  
  
        // 使用装饰器B  
        ConcreteDecoratorB decoratorB = new ConcreteDecoratorB(decoratorA);  
        decoratorB.operation();  
    }  
}
posted @   z_coding  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示