1. 程式人生 > 實用技巧 >設計模式-裝飾模式

設計模式-裝飾模式

1、裝飾模式簡介

定義:屬於結構型模式,不改變現有物件結構的情況下,動態地給該物件增加一些職責(即增加其額外功能)的模式

目的:擴充套件一個類經常使用繼承方式實現,由於繼承為類引入靜態特徵,並且隨著擴充套件功能的增多,子類會很膨脹,在不想增加很多子類的情況下擴充套件類,將具體功能職責劃分,同時繼承裝飾者模式

優點:裝飾器是繼承的有力補充,比繼承靈活,在不改變原有物件的情況下,動態的給一個物件擴充套件功能,即插即用

   通過使用不用裝飾類及這些裝飾類的排列組合,可以實現不同效果

   裝飾器模式完全遵守開閉原則

缺點:裝飾模式會增加許多子類,過度使用會增加程式得複雜性

實現

角色:抽象構件(Component)角色:定義一個抽象介面以規範準備接收附加責任的物件

   具體構件(ConcreteComponent)角色:實現抽象構件,通過裝飾角色為其新增一些職責

   抽象裝飾(Decorator)角色:繼承抽象構件,幷包含具體構件的例項,可以通過其子類擴充套件具體構件的功能

   具體裝飾(ConcreteDecorator)角色:實現抽象裝飾的相關方法,並給具體構件物件新增附加的責任

程式碼:

 1 /**抽象構件**/
 2 public interface Shape {
 3     public void draw();
 4 
 5 }
 6 
 7 /**具體構件**/
 8 public class ShapeImpl implements
Shape{ 9 10 @Override 11 public void draw() { 12 // TODO Auto-generated method stub 13 System.out.println("此時的我是齊天大聖"); 14 15 } 16 17 } 18 19 /**抽象裝飾類**/ 20 public abstract class ShapeDecorator implements Shape{ 21 protected Shape shape; 22 public ShapeDecorator (Shape shape){
23 this.shape = shape; 24 } 25 26 public void draw(){ 27 shape.draw(); 28 } 29 30 } 31 32 /**具體裝飾類A**/ 33 public class DefiniteShapeDecratorA extends ShapeDecorator{ 34 35 public DefiniteShapeDecratorA(Shape shape) { 36 super(shape); 37 } 38 private void setdrawA(){ 39 System.out.println("此時的我學藝結束,去東海搶到了定海神針"); 40 } 41 @Override 42 public void draw(){ 43 setdrawA(); 44 shape.draw(); 45 } 46 47 } 48 49 /**具體裝飾類B**/ 50 public class DefiniteShapeDecratorB extends ShapeDecorator{ 51 52 public DefiniteShapeDecratorB(Shape shape) { 53 super(shape); 54 // TODO Auto-generated constructor stub 55 } 56 private void setdrawB(){ 57 System.out.println("此時的我因大鬧天宮被壓在五指山下-_-"); 58 } 59 @Override 60 public void draw(){ 61 shape.draw(); 62 setdrawB(); 63 64 } 65 66 } 67 68 /**測試方法**/ 69 public class Test { 70 71 public static void main(String[] args) { 72 // TODO Auto-generated method stub 73 Shape shape = new ShapeImpl(); 74 75 ShapeDecorator shapeDecorator0 = new DefiniteShapeDecratorA(shape); 76 System.out.println("Test Begin============"); 77 shapeDecorator0.draw(); 78 System.out.println("Test End============"); 79 80 ShapeDecorator shapeDecorator1 = new DefiniteShapeDecratorB(shape); 81 System.out.println("Test Begin============"); 82 shapeDecorator1.draw(); 83 System.out.println("Test End============"); 84 } 85 86 } 87 88 測試結果: 89 Test Begin============ 90 此時的我學藝結束,去東海搶到了定海神針 91 此時的我是齊天大聖 92 Test End============ 93 Test Begin============ 94 此時的我是齊天大聖 95 此時的我因大鬧天宮被壓在五指山下-_- 96 Test End============