结构型模式之装饰者模式

装饰者模式(Decorator Pattern)

装饰者模式是一种结构型设计模式,它允许你动态地向对象添加额外的功能。装饰者模式通过创建一个包装器类, 将原始对象封装在其中,并提供了与原始对象相同的接口,以便其他对象可以透明地使用被装饰后的对象。
在装饰者模式中,有四个关键角色: 抽象组件(Component):定义了原始对象和装饰器对象的共同接口。 具体组件(Concrete Component):实现了抽象组件的接口,是被装饰的原始对象。 抽象装饰器(Decorator):继承自抽象组件,并持有一个抽象组件的引用,用于封装具体组件并增加额外的行为。 具体装饰器(Concrete Decorator):继承自抽象装饰器,实现了额外的行为,并调用抽象组件的方法。
使用装饰者模式可以灵活地组合多个装饰器对象,实现对原始对象的动态扩展,而无需修改其代码。 这种模式遵循开放-封闭原则,即对扩展开放,对修改封闭。
/**
 * @author zhou
 *  抽象组件
 */
interface Component {
          
   
    void operation();
}

/**
 * @author zhou
 *  具体组件
 */
class ConcreteComponent implements Component {
          
   
    public void operation() {
          
   
        System.out.println("执行具体组件的操作");
    }
}

/**
 * @author zhou
 *  具体装饰器A
 */
class ConcreteDecoratorA extends Decorator {
          
   
    ConcreteDecoratorA(Component component) {
          
   
        super(component);
    }

    public void operation() {
          
   
        super.operation();
        System.out.println("增加额外的功能A");
    }
}

/**
 * @author zhou
 *  具体装饰器B
 */
class ConcreteDecoratorB extends Decorator {
          
   
    ConcreteDecoratorB(Component component) {
          
   
        super(component);
    }

    public void operation() {
          
   
        super.operation();
        System.out.println("增加额外的功能B");
    }
}

/**
 * @author zhou
 *  抽象装饰器
 */
abstract class Decorator implements Component {
          
   
    private Component component;

    Decorator(Component component) {
          
   
        this.component = component;
    }

    public void operation() {
          
   
        component.operation();
    }
}

/**
 * @author zhou
 *  客户端使用
 */
public class Client {
          
   
    public static void main(String[] args) {
          
   
        // 创建具体组件对象
        Component component = new ConcreteComponent();

        // 对具体组件对象进行装饰,可以多次装饰
        Component decoratedComponent = new ConcreteDecoratorA(new ConcreteDecoratorB(component));

        // 调用装饰后的对象的方法
        decoratedComponent.operation();
    }
}
在上述示例中,抽象组件 Component 定义了原始对象和装饰器对象的共同接口,其中 ConcreteComponent 是具体组件实现了该接口。
抽象装饰器 Decorator 继承自 Component,并持有一个 Component 的引用作为成员变量。 具体的装饰器类 ConcreteDecoratorA 和 ConcreteDecoratorB 继承自 Decorator,在继承的基础上增加了额外的功能。
在客户端代码中,创建了具体组件对象 ConcreteComponent。 然后使用装饰器对该对象进行装饰,可以通过多次装饰来添加不同的功能。 最后,调用装饰后的对象的方法,会依次执行被装饰对象和每个装饰器对象的操作。
经验分享 程序员 微信小程序 职场和发展