java设计模式-装饰器模式(Decorator)
2019-07-11 本文已影响75人
yiqiquhuxi
装饰器模式,属于结构型模式。
装饰器,顾名思义,就是在不改变原来结构的基础上,进行装饰。
今天我们以圣诞树
![](https://img.haomeiwen.com/i2546594/026b1235430156d2.jpg)
为例,给圣诞树进行装饰,我们给一个普通圣诞树,装上彩带,它就是一个彩带的圣诞树;给圣诞树装上星星,它就是一个星星的圣诞树;同时给圣诞树装上彩带,星星,它就是星星和彩带的圣诞树。如图:
组件:
![](https://img.haomeiwen.com/i2546594/4d2c62bb8a9e7195.png)
具体实现:
![](https://img.haomeiwen.com/i2546594/58bcddf47472ee2d.png)
装饰器:
![](https://img.haomeiwen.com/i2546594/3823bf5cfec545aa.png)
彩带圣诞树继承了装饰器:
![](https://img.haomeiwen.com/i2546594/34bf10de356f0d7e.png)
星星圣诞树继承了装饰器 :
![](https://img.haomeiwen.com/i2546594/a6b41869d2fe2ec5.png)
测试类:
![](https://img.haomeiwen.com/i2546594/160943c20fe30199.jpg)
通过结果可以看出来,即使是给圣诞树装上彩带,普通的圣诞树还在,不会影响原有的接口。给彩带圣诞树装上星星,彩带圣诞树和普通圣诞树也会一直存在,不影响原有的接口。这就是装饰器模式的好处。
有人会说。我通过多个类实现Shu接口,也能实现多个圣诞树,没错,当然可以。这也看出来装饰器模式的意图:在不想增加很多子类的情况下扩展类。
JDK源码分析:
![](https://img.haomeiwen.com/i2546594/779eeb04c1023dfe.png)
JDK中inputstream 是一个比较经典的装饰器模式,分析如下:
inputStream是我们的接口组件类(抽象类或者接口,相当于上面的Shu)
![](https://img.haomeiwen.com/i2546594/0dc71771ed92312c.png)
FileInputStream 是普通的接口实现(可忽略)
![](https://img.haomeiwen.com/i2546594/6434c6ffb2c20395.png)
FilterInputStream使我们的装饰器(Decorator)
![](https://img.haomeiwen.com/i2546594/264b38eea14d8aed.jpg)
具体装饰类(相当于上面的Caidai类):
![](https://img.haomeiwen.com/i2546594/23fb1e6d5e3de57b.jpg)
![](https://img.haomeiwen.com/i2546594/b3c61af5eb14a788.png)
具体装饰类中引入了InputStream。不论具体装饰类:DataInputStream,LineNumerInputStream怎么扩展,底层用的都是InputStrem接口对象。满足了设计模式的开闭原则。