結構型模式之裝飾
阿新 • • 發佈:2017-08-14
簡單 註意 xtend component 存儲 div extend closed 靈活
裝飾(Decorator)模式是對象結構模式,GOF對它的作用描述為:動態地給一個對象添加一些額外的職責,就增加功能來說,Decorator模式比生成子類更為靈活。現在直接給出GOF著作中的Decorator模式結構圖:
實現案例是學習設計模式的好辦法,GOF一書中給了一個例子,就是“圖形用戶界面”設計的問題,一個圖形用戶界面工具箱允許你對任意一個用戶界面組件添加一些特性,例如邊框,或是一些行為,例如窗口滾動。 可以使用繼承實現,但方法太過死板,因為通過繼承實現的邊框,它的選擇是靜態的,用戶不能控制對組件加邊框的方式和時機。記住:繼承是強關聯關系。較為靈活的辦法是將組件放到一個對象中,由這個對象為組件添加邊框。而這個嵌入的對象就是裝飾。類圖如下圖:
由給定的類圖結構,設計以下相應的代碼,如下:
1 abstract class VisualComponent{ 2 public VisualComponent(){}; 3 abstract void Draw(); 4 abstract void Resize(); 5 } 6 abstract class Decorator extends VisualComponent{ 7 private VisualComponent v; 8 public Decorator(VisualComponent v){this.v=v;};View Code9 void Draw(){v.Draw();}; 10 void Resize(){v.Resize();}; 11 } 12 class TextView extends VisualComponent{ 13 public TextView(){}; 14 public void Draw(){ 15 System.out.println("Draw a TextView"); 16 } 17 public void Resize(){ 18 System.out.println("Reset the text‘s size");19 } 20 } 21 class BorderDecorator extends Decorator{ 22 private int width; 23 public BorderDecorator(VisualComponent v,int width){ 24 super(v); 25 this.width=width; 26 } 27 private void DrawBorder(int width){ 28 System.out.println("Decorate it with a line whose width is "+width); 29 } 30 public void Draw(){ 31 super.Draw(); 32 DrawBorder(width); 33 } 34 } 35 36 public class Test{ 37 38 public static void main(String[] args){ 39 40 new BorderDecorator(new TextView(),10).Draw(); 41 } 42 }
裝飾模式典型的創建對象的過程如下代碼所示。
1 new Decorator1( 2 new Decorator2( 3 new Decorator3( 4 new ConcreteComponent() 5 ) 6 ) 7 );View Code
使用裝飾模式要註意以下幾點:
1、接口的一致性。裝飾對象必須和它所裝飾的Component的接口要一致,組件類和裝飾類必須有一個公共的父類。
2、保持Component類的簡單性。Component應集中定義接口(也就是方法),而不是用於存儲數據,應該把數據的定義延遲到子類中。
結構型模式之裝飾