聊聊Java设计模式-装饰器模式

简介: 装饰器模式允许向一个现有的对象添加新的功能,同时不改变其结果。比如Java 中的IO框架中,`FileInputStream`(处理文件)、`ByteArrayInputStream`(处理字节数组)、`BufferedInputStream`(带缓存的处理类)等就是对`InputStream`进行的功能扩展,这就是装饰器模式的典型应用。

装饰器(Decorator)模式:指不改变现有对象结构的情况下,动态地给该对象增加额外功能。

一、装饰器模式介绍

装饰器模式允许向一个现有的对象添加新的功能,同时不改变其结果。比如Java 中的IO框架中,FileInputStream(处理文件)、ByteArrayInputStream(处理字节数组)、BufferedInputStream(带缓存的处理类)等就是对InputStream进行的功能扩展,这就是装饰器模式的典型应用。比如下面就是以缓存方式读取输入流:

InputStream inputStream = new BufferedInputStream(new FileInputStream("test.txt"));
byte[] data = new byte[128];
while(inputStream.read(data) != -1){
   
   
    //...
}

1.1 装饰器模式结构

装饰器主要使用组合关系来创建一个装饰对象,用于包裹真实对象,并在保持真实对象的类结构不变的前提下为其提供额外的功能。具体的基本结构如下所示:

image-20220331203832443

  • Component:抽象构件,定义一个抽象接口以规范准备接收附加责任的对象
  • ComponentA:具体构件,实现抽象构件,通过装饰角色为其添加一些职责
  • Decorator:抽象装饰构件,并包含具体构件的实例
  • DecoratorA、DecoratorB:实现抽象装饰构件的具体装饰构件,包含实现抽象装饰的相关方法
  • Client:客户端

1.2 装饰器模式实现

根据上面的类图可以实现如下代码:

/**
 * @description: 抽象构件角色
 * @author: wjw
 * @date: 2022/3/31
 */
public interface Component {
   
   

    public void operation();
}

/**
 * @description:具体构件角色
 * @author: wjw
 * @date: 2022/3/31
 */
public class ComponentA implements Component{
   
   

    public ComponentA() {
   
   
        System.out.println("创建具体构件componentA");
    }

    @Override
    public void operation() {
   
   
        System.out.println("我是具体构件A的operation方法");
    }
}

/**
 * @description: 抽象装饰
 * @author: wjw
 * @date: 2022/3/31
 */
public class Decorator implements Component{
   
   

    private Component component;

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

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

/**
 * @description: 具体装饰角色A
 * @author: wjw
 * @date: 2022/3/31
 */
public class DecoratorA extends Decorator{
   
   

    public DecoratorA(Component component) {
   
   
        super(component);
    }

    @Override
    public void operation() {
   
   
        super.operation();
        addedFunction();
    }

    /**
     * 增加的额外功能
     */
    public void addedFunction() {
   
   
        System.out.println("我是为具体装饰角色A增加额外功能方法addedFunction");
    }
}

/**
 * @description: 具体装饰角色B
 * @author: wjw
 * @date: 2022/3/31
 */
public class DecoratorB extends Decorator{
   
   

    public DecoratorB(Component component) {
   
   
        super(component);
    }

    @Override
    public void operation() {
   
   
        super.operation();
        addedFunction();
    }

    private void addedFunction() {
   
   
        System.out.println("为具体装饰角色增加额外的功能B");
    }
}

/**
 * @description: 客户端
 * @author: wjw
 * @date: 2022/3/31
 */
public class DecoratiorClient {
   
   

    public static void main(String[] args) {
   
   
        Component componentA = new ComponentA();
        componentA.operation();
        Decorator decoratorA = new DecoratorA(componentA);
        decoratorA.operation();
    }
}

二、装饰器模式应用场景

2.1 Java IO 类中的应用

在开始介绍中提到,IO中有很多装饰器的应用:

IO

如上图所示,比如InputStream后面的若干装饰器类都是对其的功能扩展。

2.2 MyBatis 中 Cache的应用

Cache 中除了有数据存储和缓存的基本功能外还有其他附加的 Cache 类,比如有 FifoCache(先进先出)、LruCache(最近最少使用LRU)、SychronizedCache(防止多线程并发访问)的众多附加功能的缓存类。都是装饰器的应用:

image-20220331224248502

参考资料

https://mp.weixin.qq.com/s/hDJs6iG_YPww7yeiPxmZLw?

http://c.biancheng.net/view/1366.html

目录
相关文章
|
21天前
|
设计模式 Java 开发者
设计模式揭秘:Java世界的七大奇迹
【4月更文挑战第7天】探索Java设计模式:单例、工厂方法、抽象工厂、建造者、原型、适配器和观察者,助你构建健壮、灵活的软件系统。了解这些模式如何提升代码复用、可维护性,以及在特定场景下的应用,如资源管理、接口兼容和事件监听。掌握设计模式,但也需根据实际情况权衡,打造高效、优雅的软件解决方案。
|
22天前
|
设计模式 存储 Java
23种设计模式,享元模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享技术有效地支持大量细粒度对象的重用。这个模式在处理大量对象时非常有用,特别是当这些对象中的许多实例实际上可以共享相同的状态时,从而可以减少内存占用,提高程序效率
35 4
|
22天前
|
设计模式 Java 中间件
23种设计模式,适配器模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】适配器模式(Adapter Pattern)是一种结构型设计模式,它的主要目标是让原本由于接口不匹配而不能一起工作的类可以一起工作。适配器模式主要有两种形式:类适配器和对象适配器。类适配器模式通过继承来实现适配,而对象适配器模式则通过组合来实现
31 4
|
20天前
|
设计模式 监控 Java
设计模式 - 观察者模式(Observer):Java中的战术与策略
【4月更文挑战第7天】观察者模式是构建可维护、可扩展系统的关键,它在Java中通过`Observable`和`Observer`实现对象间一对多的依赖关系,常用于事件处理、数据绑定和同步。该模式支持事件驱动架构、数据同步和实时系统,但需注意避免循环依赖、控制通知粒度,并关注性能和内存泄漏问题。通过明确角色、使用抽象和管理观察者注册,可最大化其效果。
|
18小时前
|
设计模式 消息中间件 Java
Java 设计模式:探索发布-订阅模式的原理与应用
【4月更文挑战第27天】发布-订阅模式是一种消息传递范式,被广泛用于构建松散耦合的系统。在 Java 中,这种模式允许多个对象监听和响应感兴趣的事件。
8 2
|
18小时前
|
设计模式 算法 Java
Java 设计模式:探索策略模式的概念和实战应用
【4月更文挑战第27天】策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在 Java 中,策略模式通过定义一系列的算法,并将每一个算法封装起来,并使它们可以互换,这样算法的变化不会影响到使用算法的客户。
6 1
|
1天前
|
设计模式 安全 Java
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
|
3天前
|
设计模式 算法 Java
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
|
3天前
|
设计模式 JavaScript Java
[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式
[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式
|
4天前
|
设计模式 存储 JavaScript
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式