java设计模式-装饰器模式(Decorator)

装饰器模式,属于结构型模式。

装饰器,顾名思义,就是在不改变原来结构的基础上,进行装饰。


UML图:

装饰器模型

今天我们以圣诞树

被装饰起来的圣诞树

为例,给圣诞树进行装饰,我们给一个普通圣诞树,装上彩带,它就是一个彩带的圣诞树;给圣诞树装上星星,它就是一个星星的圣诞树;同时给圣诞树装上彩带,星星,它就是星星和彩带的圣诞树。如图:

组件:

树接口

具体实现:

普通圣诞树实现了树接口

装饰器:

装饰器实现了树接口

彩带圣诞树继承了装饰器:

圣诞树装饰彩带

星星圣诞树继承了装饰器 :

圣诞树装饰星星

测试类:

测试类

通过结果可以看出来,即使是给圣诞树装上彩带,普通的圣诞树还在,不会影响原有的接口。给彩带圣诞树装上星星,彩带圣诞树和普通圣诞树也会一直存在,不影响原有的接口。这就是装饰器模式的好处。

有人会说。我通过多个类实现Shu接口,也能实现多个圣诞树,没错,当然可以。这也看出来装饰器模式的意图:在不想增加很多子类的情况下扩展类。



JDK源码分析:

inputStream类结构

JDK中inputstream 是一个比较经典的装饰器模式,分析如下:


inputStream是我们的接口组件类(抽象类或者接口,相当于上面的Shu)

InputStream

FileInputStream 是普通的接口实现(可忽略)

FileInputStream

FilterInputStream使我们的装饰器(Decorator)

装饰器

具体装饰类(相当于上面的Caidai类):

具体装饰类DataInputStream


具体装饰类LineNumerInputStream

具体装饰类中引入了InputStream。不论具体装饰类:DataInputStream,LineNumerInputStream怎么扩展,底层用的都是InputStrem接口对象。满足了设计模式的开闭原则。

你可能感兴趣的:(java设计模式-装饰器模式(Decorator))