首页 > 其他分享 >装饰模式

装饰模式

时间:2023-03-02 22:37:03浏览次数:38  
标签:读取 扩展 模式 装饰 Reader public

概述

《设计模式》一书中对于 “装饰模式” 的动机描述如下:

动态地给一个对象添加一些额外的职责

按照 SOLID 面向对象编程原则中的 O(开闭原则),对于功能的修改应当关闭,而对于功能的扩展应予以放开,“装饰模式” 就很好地体现了这一点

一般装饰模式的 UML 图如下所示:

Decorator.png

一般在以下几种i情况中使用装饰模式:

  • 在不影响其它对象的情况下,以动态、透明的方式给单个对象添加职责
  • 处理那些可以撤销的职责
  • 当不能通过生成子类的方式来对已有类的功能进行扩展(语法上不能扩展或者需要扩展的子类太多)

具体实例

一个比较经典的实例就是 javaIO 处理类,对于基层的数据读取来讲,可以通过 Reader 来读取字符,具体有以下几个方法:

public abstract class Reader implements Readable, Closeable {
    // 这个方法每次将会读取一个单独的字符
    public int read() throws IOException {
        // 省略具体内容
    }
}

一般如果希望读取一个文本文件,那么可能希望一次读取一行内容而不是一个字符,因此引入了 BufferedReader 来对其进行扩展,扩展后的 BufferedReader 需要一个 Reader 作为构造参数,通过 Readerread() 方法来实现每次读取一行数据的功能:

public class BufferedReader extends Reader {
    private Reader in;

    private char cb[];
    private int nChars, nextChar;
    
    public BufferedReader(Reader in, int sz) {
        super(in);
        if (sz <= 0)
            throw new IllegalArgumentException("Buffer size <= 0");
        this.in = in;
        cb = new char[sz];
        nextChar = nChars = 0;
    }
    
    // 每次读取一行文本内容
    public String readLine() throws IOException {
        return readLine(false);
    }
    
    // Reader 方法,每次读取一个字符
    public int read() throws IOException {
        // 省略部分内容。。。。
    }
}

这是一个典型的装饰模式的使用

总结

一般扩展类的功能可以通过继承的方式来实现,而引入装饰模式则提供了另一种可行的扩展实现方案。相比较于通过继承的方式来扩展功能, “装饰模式” 会更加灵活,并且可以简化部分类结构。但 “装饰模式” 的引入也可能会导致类的扩展点不容易被发现,因此希望再进行其它的扩展时可能相比较于继承的方式来讲更加困难,在设计类的结构时需要做出部分的取舍


参考:

[1] 《设计模式—可复用面向对象基础》

标签:读取,扩展,模式,装饰,Reader,public
From: https://www.cnblogs.com/FatalFlower/p/17173810.html

相关文章

  • 创建型:工厂模式-简单工厂
    定义之所以叫简单工厂是因为真的非常简单,只要一个工厂(函数)就可以了,如果把被创建的对象称为产品,把创建产品的对象或者方法称为工厂,那么只需要传入不同的参数,就可以......
  • 456. 132 模式
    给你一个整数数组nums,数组中共有n个整数。132模式的子序列由三个整数nums[i]、nums[j]和nums[k]组成,并同时满足:i<j<k和nums[i]<nums[k]<nums[j]。......
  • 软件体系架构方面英文文章翻译----Android中MVC、MVP和MVVM架构模式的区别
    DifferenceBetweenMVC,MVPandMVVMArchitecturePatterninAndroid22Dec,2022Developinganandroidapplicationbyapplyingasoftwarearchitecturepattern......
  • 设计模式3——结构型模式
    结构型模式描述如何将类或对象按某种布局组成更大的结构,它分为类结构型和对象结构型模式,前者采用继承机制来组织接口和类,后者采用组合或聚合来组合对象。由于组合关系或聚......
  • 16进制颜色转RGB模式带透明度
    functiontoColorRgba(color,opacity){//16进制颜色值的正则varreg=/^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;//把颜色变成小写varcolor=col......
  • 创建型:构造器模式
    简介构造器模式,也被称为建造者、生成器模式,是设计模式中比较容易理解的模式之一。定义:将一个对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。定义不......
  • 21-中介者模式
    21-中介者模式概念中介者模式,又叫调停者模式(mediator),用一个中介对象来封装一系列的对象交互。中介者使个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变......
  • 轻松玩转makefile | 变量与模式
    前言本文通过简单的几个示例,以及对同一个Makefile进行几个版本的迭代,帮助快速的理解变量和模式规则的使用。1、回顾在上一篇文章中,我们使用Makefile编译fun.c和main.c这......
  • 设计模式与前端工程师
     前端要不要学习设计模式始终认为每个行业都有自己的特点,各自的专业性。一个开发工程师如果不知道电脑是哪些基本硬件组成,那么我们大概率都会认为这个人非常不专业。......
  • JAVA设计模式之单例模式
    设计模式设计模式(DesignPattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及......