1.装饰者模式定义
Decorator装饰者模式指的是给一个对象添加一些新的功能进行扩展,而且是不改变原来对象的基础上动态的添加。就好比给一个毛坯房刷漆装饰,通过装饰可以让你的房子更加漂亮。
2.装饰者模式存在的意义
我们知道平时我们想要给一类进行扩展功能使得更加丰富,基本上都是通过写一个子类继承它,然后重写它的方法进行丰富扩展,继承带来比较大的缺点就是类的耦合度变高,并且会产生很多的子类,维护的成本也会很高。
如果即可以在保证对象功能可以得到扩展,又能提供比继承还要灵活的实现方式那不是很棒?这就是装饰者模式存在的意义了。
3.装饰者模式的构成
想要完成装饰者模式,我们只需要实现它规定的几个角色即可。
·被装饰对象的抽象组件(Component)·被装饰对象(ConcreteComponent)·装饰对象抽象(Decorator)·具体的装饰对象(ConcreteDecorator)
Component:表示定义被装饰者所具备的基本功能,通常使用接口来定义。
ConcreteComponent:定义出被装饰对象的具体功能。
Decorator:定义了所有具体装饰对象的功能规范,需要跟Component被装饰者具备同样的功能,所以需要Decorator实现Component接口。并且装饰者持有被装饰者对象引用。
ConcreteDecorator:具体的装饰对象,在继承装饰对象的功能外,动态添加新的功能。
4.装饰者模式的实现
下面我们按照上述种的角色定义来实现一下装饰者模式。我们以开发者为例实现下,并最终进行测试。
5.装饰者模式使用场景以及和代理模式的区别
其实Java中就有很多装饰者模式的影子,比如我们学习IO流的时候的缓冲流就是装饰者模式(BufferedInputStream、BufferedOutputStream)、转换流、Spring框架中BeanWrapper等都是使用的装饰者模式。
我们自己开发的时候如果需要对对象已有功能进行功能扩展的时候,就要使用装饰者模式了。
最后注意的是装饰者模式和代理模式不要搞混了,代理模式的角色和意义跟装饰者模式都是不一样的。
代理模式是为对象提供一种代理以控制对这个对象的访问,它主要解决的是在直接访问对象时带来的一些问题的。
而装饰者模式更多的是对访问对象增加功能不像代理模式是在控制和限制功能访问。