1. 程式人生 > >設計模式之結構型--裝飾模式

設計模式之結構型--裝飾模式

ret his 組合 子類 產生 margin per 調用 輸出

裝飾模式:

職責:

動態得為一個對象增加新的功能
裝飾模式是一種用於代替繼承的技術,無須通過繼承增加子類就
能擴展對象的新功能。使用對象的關聯關系代替繼承關系,更加靈活。
同時避免類型體系的快速膨脹
實現細節:
Component抽象構件角色
真實對象和裝飾有相同的接口,這樣,客戶端對象就能夠以真實
對象相同的方式同裝飾對象交互
ConcreteComponent具體構件角色(真實對象)
io流中的FIleInputStream,FileOutputStream
Decorator裝飾角色
持有一個抽象構件的引用。裝飾對象接受所有客戶端的請求,並把這些
請求轉發給真實的對象。這樣,就能載真實對象調用前後增加新的功能
ConcreteDecorator具體裝飾角色:
負責給構件對象增加新的責任

開發中使用的場景:

IO中的輸入流和輸出流的設計
Swing包中圖形界面構件功能
Servlet API中提供了一個request對象的Decorator設計模式的默認實現類
HttpServletRequestWrapper,HttpServletRequestWrapper類,增強了request
對象的功能。
Struts2中,request,response,session對象的處理

總結:

裝飾模式(decorator)也叫包裝器模式(Wrapper)
裝飾模式降低系統的耦合度,可以動態的增加或刪除對象的職責
並使得需要裝飾的具體構建類和具體裝飾類可以獨立變化,以便增加
新的具體構建類和具體裝飾類

優點:

擴展對象功能,比繼承靈活,不會導致類個數急劇增加。
可以對一個對象進行多次裝飾,創造出不同行為的組合,得到功能
更加強大的對象
具體構建類和具體裝飾類可以獨立變化,用戶可以根據需要自己增加新的具體
構件子類和具體裝飾子類

缺點:

產生很多小對象,大量小對象占據內存,一定程度上影響性能
裝飾模式易出錯,調試排查比較麻煩,

裝飾模式和橋接模式的區別:

兩個模式都是為了解決過多子類對象問題,但是他們的誘因不一樣
橋接模式是對象自身現有機制沿著多個維度變化,是即有部分不穩定
裝飾模式是為了增加新的功能

 1 package com.luruixiao.pattern.decorator;
2 3 /** 4 * 裝飾模式 5 * 抽象構建 6 * @author lenovo 7 * 8 */ 9 public interface ICar { 10 void move(); 11 } 12 13 //ConcreteComponent具體構件角色(真實對象) 14 class Car implements ICar{ 15 @Override 16 public void move() { 17 System.out.println("陸上跑"); 18 } 19 } 20 //Decorator裝飾角色 21 class SuperCar implements ICar{ 22 protected ICar car; 23 public SuperCar() { 24 super(); 25 } 26 public SuperCar(ICar car) { 27 super(); 28 this.car = car; 29 } 30 @Override 31 public void move() { 32 this.car.move(); 33 } 34 } 35 //ConcreteDecorator具體裝飾角色: 36 class FlyCar extends SuperCar{ 37 public FlyCar() { 38 super(); 39 } 40 public FlyCar(ICar car) { 41 super(car); 42 } 43 public void flyMove() { 44 System.out.println("天上飛"); 45 } 46 @Override 47 public void move() { 48 super.move(); 49 flyMove(); 50 } 51 } 52 53 class WaterCar extends SuperCar{ 54 55 public WaterCar() { 56 super(); 57 } 58 public WaterCar(ICar car) { 59 super(car); 60 } 61 public void waterMove() { 62 System.out.println("水裏泳"); 63 } 64 @Override 65 public void move() { 66 super.move(); 67 waterMove(); 68 } 69 } 70 71 class AICar extends SuperCar{ 72 73 public AICar() { 74 super(); 75 } 76 public AICar(ICar car) { 77 super(car); 78 } 79 public void autoMove() { 80 System.out.println("自動駕駛"); 81 } 82 @Override 83 public void move() { 84 super.move(); 85 autoMove(); 86 } 87 }

 1 package com.luruixiao.pattern.decorator;
 2 
 3 public class Client {
 4     public static void main(String[] args) {
 5         Car car = new Car();
 6         car.move();
 7         System.out.println("增加一個水上跑的功能");
 8         WaterCar waterCar = new WaterCar(car);
 9         waterCar.move();
10         System.out.println("增加一個天上飛的功能");
11         FlyCar flyCar = new FlyCar(car);
12         flyCar.move();
13         System.out.println("增加三個功能,水上跑,天上飛,自動駕駛");
14         AICar ai = new AICar(new WaterCar(new FlyCar(new Car())));
15         ai.move();
16     }
17 }    

設計模式之結構型--裝飾模式