(1)動態的爲一個對象增長新的功能。設計模式
(2)裝飾模式是一種用於代替繼承的技術,無需經過繼承增長子類就能擴展對象的新功能。session
使用對象的關聯關係代替繼承關係,更加靈活,同時避免類型體系的快速膨脹。app
(1)Componen 抽象構件角色:ide
真實對象和裝飾對象有相同的接口。這樣,客戶端就可以以真實對象相同的方式同裝飾對象交互。性能
(2)ConcreteComponent 具體構件角色(真是角色):測試
IO 流中的FileInputStream、FileOutputStreamthis
(3)Decorator 裝飾角色:人工智能
持有一個抽象構件的引用。裝飾對象接受全部客戶端的請求,並把這些請求轉發給真實的對象,這樣就能在真實對象調用先後增長新的功能。spa
場景:設計一款能夠增長任意功能的汽車,除了陸地上跑之外,還能夠隨意增長天上飛、水上游、自動駕駛等功能。設計
1 /** 2 * Component抽象構件角色 3 * @author CL 4 * 5 */ 6 public interface ICar { 7 void move(); 8 } 9 10 /** 11 * ConcreteComponent具體構件角色(真實角色) 12 * @author CL 13 * 14 */ 15 class Car implements ICar { 16 17 @Override 18 public void move() { 19 System.out.println("陸地上跑!"); 20 } 21 22 } 23 24 /** 25 * Decorator裝飾角色 26 * @author CL 27 * 28 */ 29 class SuperCar implements ICar { 30 protected ICar car; 31 32 public SuperCar(ICar car) { 33 this.car = car; 34 } 35 36 @Override 37 public void move() { 38 car.move(); 39 } 40 } 41 42 /** 43 * ConcreteDecorator具體裝飾角色 44 * 新增新的功能:天上飛 45 * @author CL 46 * 47 */ 48 class FlyCar extends SuperCar { 49 50 public FlyCar(ICar car) { 51 super(car); 52 } 53 54 public void fly() { 55 System.out.println("天上飛!"); 56 } 57 58 @Override 59 public void move() { 60 super.move(); 61 fly(); 62 } 63 64 } 65 66 /** 67 * ConcreteDecorator具體裝飾角色 68 * 新增新的功能:水上游 69 * @author CL 70 * 71 */ 72 class WaterCar extends SuperCar { 73 74 public WaterCar(ICar car) { 75 super(car); 76 } 77 78 public void swim() { 79 System.out.println("水上游!"); 80 } 81 82 @Override 83 public void move() { 84 super.move(); 85 swim(); 86 } 87 88 } 89 90 /** 91 * ConcreteDecorator具體裝飾角色 92 * 新增新的功能:人工智能 自動駕駛 93 * @author CL 94 * 95 */ 96 class AICar extends SuperCar { 97 98 public AICar(ICar car) { 99 super(car); 100 } 101 102 public void autoMove() { 103 System.out.println("自動駕駛!"); 104 } 105 106 @Override 107 public void move() { 108 super.move(); 109 autoMove(); 110 } 111 112 }
測試:
1 /** 2 * 測試裝飾模式 3 * @author CL 4 * 5 */ 6 public class Client { 7 8 public static void main(String[] args) { 9 System.out.println("基本功能,陸地上跑-->"); 10 Car car = new Car(); 11 car.move(); 12 13 System.out.println("\n增長新的功能,天上飛-->"); 14 FlyCar flyCar = new FlyCar(car); 15 flyCar.move(); 16 17 System.out.println("\n增長新的功能,水上游-->"); 18 WaterCar waterCar = new WaterCar(car); 19 waterCar.move(); 20 21 System.out.println("\n增長新的功能,水上游, 自動駕駛-->"); 22 AICar aCar = new AICar(new WaterCar(car)); 23 aCar.move(); 24 25 System.out.println("\n增長新的功能,天上飛,水上游, 自動駕駛-->"); 26 AICar c = new AICar( 27 new WaterCar( 28 new FlyCar(car))); 29 c.move(); 30 } 31 32 }
控制檯輸出:
基本功能,陸地上跑--> 陸地上跑! 增長新的功能,天上飛--> 陸地上跑! 天上飛! 增長新的功能,水上游--> 陸地上跑! 水上游! 增長新的功能,水上游, 自動駕駛--> 陸地上跑! 水上游! 自動駕駛! 增長新的功能,天上飛,水上游, 自動駕駛--> 陸地上跑! 天上飛! 水上游! 自動駕駛!
裝飾模式(Decorator)也叫作包裝器模式(Wrapper)
裝飾模式下降系統的耦合度,能夠動態的增長或刪除對象的職責,並使得須要裝飾的具體構建類和具體裝飾類能夠獨立變化,以便增長新的具體構建類和具體裝飾類。
優勢:
a. 擴展對象功能,比繼承靈活,不會致使類個數急劇增長;
b. 能夠對一個對象進行屢次裝飾,創造出不一樣行爲的組合,獲得功能更增強大的對象;
c. 具體構建類和具體裝飾類能夠獨立變化,用戶能夠根據須要本身增長新的具體構件子類和具體裝飾子類。
缺點:
a. 產生不少小對象,大量小對象佔據內存,必定程度上影響性能;
b. 裝飾模式易於出錯,調試排查比較麻煩。
(1)IO 中輸入流和輸出流的設計
a. Componen 抽象構件角色:
IO 流中的InputStream、OutputStream、Reader、Writer
b. ConcreteComponen 具體構件角色:
IO 流中的FileInputStream、FileOutputStream
c. Decorator 裝飾角色:
持有一個抽象構件的引用:IO 流中的FileInputStream、FileOutputStream
d. ConcreteDecorator 具體裝飾角色:
負責給構件對象增長新的責任,IO 流中的BufferedInputStream、BufferedOutputStream
(2)Swing 包中圖形界面構件功能;
(3)Servlet API 中提供了一個 request 對象的Decorator 設計模式的默認實現類,加強了 request 對象的功能;
(4)Struts2 中,request、response、session 對象的處理;
(5)…………