博客
关于我
装饰模式(包装模式)—结构型
阅读量:510 次
发布时间:2019-03-07

本文共 2564 字,大约阅读时间需要 8 分钟。

设计模式是软件开发中的重要概念,主要用于解决常见问题,提高代码复用性和可维护性。常见的设计模式包括创建型、结构型和行为型三大类。通过深入理解结构型模式,可以发现这一类模式的核心思想是将复杂的功能分解为多个简单组件的组合,从而简化系统设计。

结构型模式简介

结构型模式总结了一些常见的对象或类组合的典型结构,能够高效解决特定的应用场景问题。最典型的结构型模式包括代理模式、桥接模式、装饰器模式、适配器模式等。这些模式通过组合的方式,避免直接使用继承,从而降低了代码的耦合度。

装饰模式详解

装饰模式(Decorator Pattern)是一种常见的设计模式,其核心思想是通过组合而非继承来扩展对象功能。装饰模式灵活性极高,适用于需要向现有类添加功能或改变行为的场景。在实际应用中,便于干净地扩展代码,而无需不断地加新继承类。

生活中的装饰模式

装饰模式在生活中比比皆是。例如,无论是我们的电器包装还是日常服装,都在通过不同的装饰方式展现出独特的个性。更贴近技术领域,Java IO流中的 BufferedReader、BufferedWriter 等类都是装饰模式的典型应用,它们为数据读写操作提供了缓冲功能,显著提升了性能和用户体验。

装饰模式的典型场景

在IO操作中,装饰模式通过在数据流周围包装功能,实现对流的优化和扩展。比如:

  • BufferedReader 是对 InputStream 进行装饰,添加了读取缓冲功能。
  • BufferedOutputStream 是对 OutputStream 的装饰,实现了写数据的缓冲。

Java源码分析

以 Java 的 BufferedReader 为例,看看其背后的实现:【 cruisuobrane 的评论】

public class BufferedReader implements Reader {    private InputStream reader;    public BufferedReader(InputStream reader) {        this.reader = reader;    }    public BufferedReader(InputStream reader, int buffer_size) {        this.reader = reader;        this.buffer = new char[buffer_size];    }    public void close() throws IOException {        if (reader != null) {            reader.close();            reader = null;        }    }    public int read() throws IOException {        synchronized (lock) {            if (reader == null) {                return -1;            }            return reader.read();        }    }    // 其他读取方法}

从代码可以看出, BufferedReader 维护了一个 InputStream 的引用,并通过读取操作实现了缓冲功能。

Android源码中的装饰模式

在 Android 开源项目中,装饰模式广泛应用于应用程序的上下文管理。例如,Context 类作为结构型模式的核心,通过装饰模式扩展了丰富的功能,如资源管理、服务启动等。【 cruisuobrane 的评论 ]Context 类提供了与系统服务交互的接口,具体实现通过继承和装饰模式结合实现。

ContextImpl 类的实现

ContextImpl 作为 Context 的具体实现类,扩展了系统服务的启动和管理功能。

class ContextImpl extends Context {    @Override    public ComponentName startService(Intent service) {        return startServiceCommon(service, false, mUser);    }    // 其他方法...}

通过 startServiceCommon 方法的调用,ContextImpl 提供了跨进程的服务启动功能。

ContextWrapper 类的应用

ContextWrapper 类是装饰模式的典型应用,它通过将不同的视图系统(如 XML 转换为 View)为应用程序提供统一接口。

class ContextWrapper extends Context {    private final Context mBase;    public ContextWrapper(Context base) {        mBase = base;    }    @Override    public ComponentName startService(Intent intent) {        return mBase.startService(intent);    }    // 其他方法...}

ContextWrapper 的设计清晰地展示了装饰模式——通过使用已有的 Context 实现,轻松扩展功能。

总结

在设计模式中,装饰模式通过组合和透_unregister_for_moving_the_component_off_the_stack_pril表示增强功能,而无需直接修改对象。这种设计理念在 IO 操作、资源管理等领域显得尤为重要。在 Java 和 Android 的源码中,装饰模式的应用更是体现了其高效和可维护的特点。这一模式不仅便于代码扩展,还能减少代码的复杂性。

通过对装饰模式的掌握,可以更好地理解和优化 Java 应用程序的 IO 操作或资源管理逻辑,大大提升代码的质量和性能表现。

转载地址:http://hcvjz.baihongyu.com/

你可能感兴趣的文章
RabbitMQ - 死信、TTL原理、延迟队列安装和配置
查看>>
PHP数据访问的多重查询(租房子查询)
查看>>
RabbitMQ - 如保证消息的可靠性?(消息确认、消息持久化、失败重试机制)
查看>>
RabbitMQ - 基于 SpringAMQP 带你实现五种消息队列模型
查看>>
php数组函数分析--array_column
查看>>
php数组去重复数据的小例子
查看>>
php数组实现:哈希 +双向链表
查看>>
PHP数组排序函数array_multisort()函数详解(二)
查看>>
php数组的几个函数和超全局变量
查看>>
PHP文件上传详解
查看>>
PHP文件锁
查看>>
php文本框输入制定文本,php – 当用户没有向文本框输入任何内容时...
查看>>
PHP时间戳和日期相互转换操作总结
查看>>
php时间戳知识点,php 时间戳函数总结与示例
查看>>
php更新数据库失败,php – 无法更新MySQL数据库
查看>>
php机器人聊天对话框,基于AIML的PHP聊天机器人
查看>>
PHP查找数组中最大值与最小值
查看>>
php查最大值,在PHP数组中查找最大值
查看>>
php标签筛选,关于PHP CodeIgniter框架中通过<a>标签和url做多条件分类筛选
查看>>
php根据年月日计算年龄
查看>>