装饰器模式,属于结构型模式。
装饰器,顾名思义,就是在不改变原来结构的基础上,进行装饰。
今天我们以圣诞树
被装饰起来的圣诞树为例,给圣诞树进行装饰,我们给一个普通圣诞树,装上彩带,它就是一个彩带的圣诞树;给圣诞树装上星星,它就是一个星星的圣诞树;同时给圣诞树装上彩带,星星,它就是星星和彩带的圣诞树。如图:
组件:
树接口具体实现:
普通圣诞树实现了树接口装饰器:
装饰器实现了树接口彩带圣诞树继承了装饰器:
圣诞树装饰彩带星星圣诞树继承了装饰器 :
圣诞树装饰星星测试类:
测试类通过结果可以看出来,即使是给圣诞树装上彩带,普通的圣诞树还在,不会影响原有的接口。给彩带圣诞树装上星星,彩带圣诞树和普通圣诞树也会一直存在,不影响原有的接口。这就是装饰器模式的好处。
有人会说。我通过多个类实现Shu接口,也能实现多个圣诞树,没错,当然可以。这也看出来装饰器模式的意图:在不想增加很多子类的情况下扩展类。
JDK源码分析:
inputStream类结构JDK中inputstream 是一个比较经典的装饰器模式,分析如下:
inputStream是我们的接口组件类(抽象类或者接口,相当于上面的Shu)
InputStreamFileInputStream 是普通的接口实现(可忽略)
FileInputStreamFilterInputStream使我们的装饰器(Decorator)
装饰器具体装饰类(相当于上面的Caidai类):
具体装饰类DataInputStream 具体装饰类LineNumerInputStream具体装饰类中引入了InputStream。不论具体装饰类:DataInputStream,LineNumerInputStream怎么扩展,底层用的都是InputStrem接口对象。满足了设计模式的开闭原则。
网友评论