设计模式之装饰者模式

装饰者模式

定义

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。设计理念主要是以对客户端透明的方式动态扩展对象的功能,是继承关系的一个替代(继承会产生大量的子类,而且代码有冗余)。

为什么要使用装饰者模式

一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,就会出现类爆炸的问题,装饰者模式可以在不创造更多子类的情况下,将对象的功能加以扩展,创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

装饰者模式介绍

在这里插入图片描述

  1. Component:抽象类,定义装饰方法的规范
  2. ConcreteComponent:被装饰者,继承Component,抽象类的具体实现, 也就是我们要装饰的具体对象。
  3. Decorator:装饰者组件,ConcreteComponent的引用作为其属性,该类的职责就是为了装饰具体组件对象,定义的规范。
  4. ConcreteDecorator:具体装饰,负责给构件对象装饰附加的功能。

举例

下面就通过一个例子来加深理解。
如果我们要实现一个手机的功能,首先想到它有很多的功能,例如打电话、发短信和上网等等,按照以前的方式应该就是通过继承来实现这些功能,如果功能很多就需要继承很多,那么就会出现很多的类,最终出现类爆炸的结果。而且一旦中间功能需要删改,往往就要重写整个类,这就有很大的问题。
接下来我们就尝试使用装饰者模式来实现这个功能。
类图如下:
在这里插入图片描述

inputStream

如果对装饰者模式还是比较模糊,不放通过I/O流来结合理解,装饰者模式就应用到了Java的I/O流中,OutputStream和InputStream就对应于抽象构件角色(Component),FileInputStream和FileOutputStream就对应具体构件角色(ConcreteComponent),FilterOutputStream和FilterInputStream就对应着装饰角色(Decorator),而BufferedOutputStream,DataOutputStream等等就对应着具体装饰角色。
在这里插入图片描述

  1. 抽象组件(InputStream) :装饰者模式中的超类,它只有一个抽象方法read(),子类都需要对该方法进行处理
  2. 被装饰者(FileInputStream , ByteArrayInputStream , StringBufferInputStream) :拥有通用实现read()基本方法
  3. 装饰者组件(FilterInputStream) :定义具体装饰者的行为规范,可以做统一基础处理。
  4. 具体装饰(BufferedInputStream , DataInputStream , Base64InputStream) :具体的装饰类,拥有对流的读操作做完成具体拓展能力。

装饰者模式让我们可以有不同的被装饰者,例如FileInputStream,并且如果想使用缓冲功能那么只需写一下代码 :

new BufferedInputStream(new FileInputStream(new File("path")));

也可以对上面代码再进行加工,简单的加密处理 :

new Base64InputStream(new BufferedInputStream(new FileInputStream(new File(""))),0)

哪怕你突然改需求了,读取的对象不是文件,而是文本或字符,那么可以轻松的将代码改为 :

new Base64InputStream(new BufferedInputStream(new StringBufferInputStream("str")),0)

总结

我们应该允许类进行扩展,而不允许类的修改。装饰类和被装饰类可以独立拓展,不会相互耦合,动态的将责任附加到对象上,若要扩展功能,装饰者模式提供了比继承更有弹性的扩展方案

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值