又称包装(wrapper)模式。
以对客户端透明(客户端并不会觉得对象在装饰前后有什么不同,老孙就是老孙!^_^)的方式扩展对象的功能,是继承关系的一个替代方案。

何时使用?
1. 需要扩展一个类的功能,或给一个类增加附加责任。
2. 需要动态地给一个对象增加功能,这些功能可以再动态地撤销。
3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实。

优点:
1. 可以提供比继承更多的灵活性。
2. 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。

缺点:
1. 会产生比使用继承关系更多的对象,会使得查错变得困难。

类图示意:



















1. com.cleversoft.designpatterns.decorator.Widget.java:
package com.cleversoft.designpatterns.decorator;

public interface Widget {
    
void draw();
}

2. com.cleversoft.designpatterns.decorator.TextField.java:
package com.cleversoft.designpatterns.decorator;

public class TextField implements Widget {
    
private int width, height;

    
public TextField(int width, int height) {
        
this.width = width;
        
this.height = height;
    }


    
public void draw() {
        System.out.println(
"TextField: " + width + "" + height);
    }

}

3. com.cleversoft.designpatterns.decorator.Decorator.java:
package com.cleversoft.designpatterns.decorator;

public abstract class Decorator implements Widget {
    
private Widget wid;

    
public Decorator(Widget wid) {
        
this.wid = wid;
    }


    
public void draw() {
        wid.draw();
    }

}

4. com.cleversoft.designpatterns.decorator.BorderDecorator.java:
package com.cleversoft.designpatterns.decorator;

public class BorderDecorator extends Decorator {

    
public BorderDecorator(Widget wid) {
        
super(wid);
    }


    
public void draw() {
        
super.draw();
        System.out.println(
"   BorderDecorator");
    }

}

5. com.cleversoft.designpatterns.decorator.ScrollDecorator.java:
package com.cleversoft.designpatterns.decorator;

public class ScrollDecorator extends Decorator {

    
public ScrollDecorator(Widget wid) {
        
super(wid);
    }


    
public void draw() {
        
super.draw();
        System.out.println(
"   ScrollDecorator");
    }


}

6. com.cleversoft.designpatterns.decorator.Client.java:
package com.cleversoft.designpatterns.decorator;

public class Client {

    
public static void main(String[] args) {
        
// Widget w = new TextField(20, 10);
        
// Widget b = new BorderDecorator(w);
        
// b.draw();

        Widget w 
= new BorderDecorator(new ScrollDecorator(
                
new TextField(5020)));
        w.draw();
    }

}


参考资料:
1. 《Java与模式》
2. Design Patterns With Code

欢迎大家访问我的个人网站 萌萌的IT人