裝飾模式(decorator)
阿新 • • 發佈:2017-08-29
imp 可復用 更多 () article ted 添加 sign 正文
意圖:
動態地給一個對象添加一些額外的職責,就增加功能而言,Decorator模式相比生成子類模式更為靈活
動機:
有時我們希望給某個對象而不是整個類添加一些功能。例如,一個圖形用戶界面工具箱允許你對任意一個用戶界面組件添加一些特性,例如邊框,或是一些行為,例如窗口滾動。一種較為靈活的方式是將組件嵌入另一個對象中,由這個對象添加邊框。我們稱這個嵌入的對象為裝飾 。這個裝飾與它所裝飾的組件接口一致,因此它對使用該組件的客戶透明。
例如,假定有一個對象 Te x t Vi e w,它可以在窗口中顯示正文。缺省的 Te x t Vi e w沒有滾動
條,因為我們可能有時並不需要滾動條。當需要滾動條時,我們可以用 S c r o l l D e c o r a t o r添加滾
動條。如果我們還想在 Te x t Vi e w周圍添加一個粗黑邊框,可以使用 B o r d e r D e c o r a t o r添加。因
此只要簡單地將這些裝飾和 Te x t Vi e w進行組合,就可以達到預期的效果。
結構:
例子:
以往畫布上畫一個圓為例來說明裝飾模式的使用
1 package designpatterns.strucural; 2 //抽象構件角色--Component 3 interface Shape { 4 void draw(); 5 } 6 //具體構件角色--Concrete Component 7 class Circle implements Shape { 8 9 @Override 10 public void draw() { 11 System.out.println("Shape: Circle");12 } 13 } 14 15 //裝飾角色--Decorator 16 abstract class ShapeDecorator implements Shape{ 17 protected Shape decoratedShape; 18 19 public ShapeDecorator(Shape decoratedShape) { 20 this.decoratedShape = decoratedShape; 21 } 22 23 public void draw() { 24 decoratedShape.draw();25 } 26 } 27 28 //具體裝飾角色--Concrete Decorator1 29 class RedShapeDecorator extends ShapeDecorator { 30 31 public RedShapeDecorator(Shape decoratedShape) { 32 super(decoratedShape); 33 } 34 35 @Override 36 public void draw() { 37 decoratedShape.draw(); 38 setRedBorder(decoratedShape); 39 } 40 41 private void setRedBorder(Shape decoratedShape) { 42 System.out.println("Border Color: Red"); 43 } 44 45 } 46 47 //具體裝飾角色--Concrete Decorator2 48 class DottedLineShapeDecorator extends ShapeDecorator { 49 50 public DottedLineShapeDecorator(Shape decoratedShape) { 51 super(decoratedShape); 52 } 53 54 @Override 55 public void draw() { 56 decoratedShape.draw(); 57 setLineType(decoratedShape); 58 } 59 60 private void setLineType(Shape decoratedShape) { 61 System.out.println("Line type: dotted"); 62 } 63 64 } 65 66 //畫布 67 class Canvas{ 68 void addshape(Shape shape){ 69 shape.draw(); 70 } 71 } 72 73 //客戶端 74 public class Decorator { 75 76 public static void main(String[] args) { 77 78 Canvas canvas = new Canvas(); 79 Circle circle = new Circle(); 80 81 canvas.addshape(circle); 82 System.out.println(); 83 84 canvas.addshape(new RedShapeDecorator(circle)); 85 System.out.println(); 86 87 canvas.addshape(new DottedLineShapeDecorator(new RedShapeDecorator(circle))); 88 System.out.println(); 89 } 90 91 }
驗證輸出:
Shape: Circle
Shape: Circle
Border Color: Red
Shape: Circle
Border Color: Red
Line type: dotted
代碼說明:
最終使用該組件的客戶為Canvas,由於裝飾和它裝飾的組件接口一致,客戶就可以隨意組合調用
1、繪制圓
2、繪制紅色的圓
3、用虛線繪制紅色的圓
你還可以添加更多的裝飾,使用時只需要將這些裝飾和組件Circul進行組合,就可以達到想要的效果
參考:
設計模式:橋接模式(Bridge)
Java與模式
設計模式:可復用面向對象軟件的基礎
裝飾模式(decorator)