装饰模式详解(实现例子及使用场景)

装饰模式详解(实现例子及使用场景)-mikechen

装饰模式是常见的Java设计模式之一,用途非常的广,下面我就重点详解装饰模式的实现与使用@mikechen

装饰模式定义

装饰模式(Decorator Pattern)是一种结构型设计模式,它允许在不改变对象的基本结构的情况下,动态地给一个对象添加新的功能。

 

装饰模式使用场景

装饰模式通常适用于以下场景:

  1. 在不改变已有代码的情况下,动态地为对象增加新的功能,避免修改原有代码带来的风险。
  2. 需要扩展一个类的功能,但是使用继承会导致类的数目增加,不利于代码的维护。
  3. 需要动态地给一个对象增加一些额外的职责,而且这些职责可以被动态地撤销,例如在运行时动态地给一个窗口控件增加边框、滚动条等功能。

 

装饰模式实现

装饰模式的实现,包含以下角色:

装饰模式详解(实现例子及使用场景)-mikechen

1.抽象组件(Component)

定义被装饰对象的接口,可以是一个抽象类或接口。

2.具体组件(Concrete Component)

实现抽象组件接口,即被装饰的对象。

3.抽象装饰器(Decorator)

继承自抽象组件,包含一个指向抽象组件的引用,以及一个实现抽象组件接口的方法。

4.具体装饰器(Concrete Decorator)

继承自抽象装饰器,实现自己的装饰逻辑,并在必要的时候调用被装饰对象的方法。

5.客户端(Client)

创建被装饰对象,并通过一系列装饰器来对被装饰对象进行装饰。

 

装饰模式使用实例

下面是一个装饰模式的示例代码:

// 抽象组件
interface Component {
    void operation();
}

// 具体组件
class ConcreteComponent implements Component {
    @Override
    public void operation() {
        System.out.println("ConcreteComponent operation");
    }
}

// 抽象装饰类
abstract class Decorator implements Component {
    protected Component component;

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

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

// 具体装饰类A
class ConcreteDecoratorA extends Decorator {
    public ConcreteDecoratorA(Component component) {
        super(component);
    }

    public void operation() {
        super.operation();
        System.out.println("ConcreteDecoratorA operation");
    }
}

// 具体装饰类B
class ConcreteDecoratorB extends Decorator {
    public ConcreteDecoratorB(Component component) {
        super(component);
    }

    public void operation() {
        super.operation();
        System.out.println("ConcreteDecoratorB operation");
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        Component component = new ConcreteComponent();
        component = new ConcreteDecoratorA(component);
        component = new ConcreteDecoratorB(component);
        component.operation();
    }
}

在上述示例代码中:

  1. 抽象组件 Component 定义了被装饰对象的接口;
  2. 具体组件 ConcreteComponent 是被装饰的对象;
  3. 抽象装饰类 Decorator 是所有具体装饰类的基类,定义了一个组件对象的引用,并实现了抽象组件的接口;
  4. 具体装饰类 ConcreteDecoratorA 和 ConcreteDecoratorB 继承自抽象装饰类 Decorator,并实现了自己的装饰功能。

以上就是装饰模式详解,更多设计模式请查看:Java设计模式:23种设计模式(万字图文全面总结)

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法