《深入分析Java web技术内幕》
装饰器模式,就是将某个类重新装饰一下,使它比原先更漂亮,或者在功能上更强大,这就是装饰器模式所有达到的目的。
但是作为原先这个类的使用者还不能感受到装饰前与装饰后有什么区别,否则就破坏了原有类的结构了,所以装饰器模式要做到
对装饰类的使用者透明。
转自:http://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html
顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,关系图如下:
Source类是被装饰类,Decorator类是一个装饰类,可以为Source类动态的添加一些功能,代码如下:
- public interface Sourceable {
- public void method();
- }
- public class Source implements Sourceable {
- @Override
- public void method() {
- System.out.println("the original method!");
- }
- }
- public class Decorator implements Sourceable {
- private Sourceable source;
- public Decorator(Sourceable source){
- super();
- this.source = source;
- }
- @Override
- public void method() {
- System.out.println("before decorator!");
- source.method();
- System.out.println("after decorator!");
- }
- }
测试类:
- public class DecoratorTest {
- public static void main(String[] args) {
- Sourceable source = new Source();
- Sourceable obj = new Decorator(source);
- obj.method();
- }
- }
输出:
before decorator!
the original method!
after decorator!
装饰器模式的应用场景:
1、需要扩展一个类的功能。
2、动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点,继承的功能是静态的,不能动态增删。)
缺点:产生过多相似的对象,不易排错!
装饰器与适配器模式都是结构型模式,但是使用它们的目的是很不一样的。
适配器模式的意义是将一个借口转变成另一个接口,通过改变接口来达到重复使用的目的;
装饰器模式是要保持原有接口,但是增强原有对象的能力,或者改变原有对象的处理方式而提升性能。
所以,这两个模式设计的目的是不同的。