GOF23設計模式之裝飾模式(decorator)

1、裝飾模式概述

  (1)動態的爲一個對象增長新的功能。設計模式

  (2)裝飾模式是一種用於代替繼承的技術,無需經過繼承增長子類就能擴展對象的新功能。session

      使用對象的關聯關係代替繼承關係,更加靈活,同時避免類型體系的快速膨脹。app

2、裝飾模式實現細節

  (1)Componen 抽象構件角色:ide

      真實對象和裝飾對象有相同的接口。這樣,客戶端就可以以真實對象相同的方式同裝飾對象交互。性能

  (2)ConcreteComponent 具體構件角色(真是角色):測試

      IO 流中的FileInputStream、FileOutputStreamthis

  (3)Decorator 裝飾角色:人工智能

      持有一個抽象構件的引用。裝飾對象接受全部客戶端的請求,並把這些請求轉發給真實的對象,這樣就能在真實對象調用先後增長新的功能。spa

3、裝飾模式情景導入

  場景:設計一款能夠增長任意功能的汽車,除了陸地上跑之外,還能夠隨意增長天上飛、水上游、自動駕駛等功能。設計

  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 }

  控制檯輸出:

基本功能,陸地上跑-->
陸地上跑!

增長新的功能,天上飛-->
陸地上跑!
天上飛!

增長新的功能,水上游-->
陸地上跑!
水上游!

增長新的功能,水上游, 自動駕駛-->
陸地上跑!
水上游!
自動駕駛!

增長新的功能,天上飛,水上游, 自動駕駛-->
陸地上跑!
天上飛!
水上游!
自動駕駛!

4、裝飾模式總結

  裝飾模式(Decorator)也叫作包裝器模式(Wrapper)

  裝飾模式下降系統的耦合度,能夠動態的增長或刪除對象的職責,並使得須要裝飾的具體構建類和具體裝飾類能夠獨立變化,以便增長新的具體構建類和具體裝飾類。

  優勢:

    a. 擴展對象功能,比繼承靈活,不會致使類個數急劇增長;

    b. 能夠對一個對象進行屢次裝飾,創造出不一樣行爲的組合,獲得功能更增強大的對象;

    c. 具體構建類和具體裝飾類能夠獨立變化,用戶能夠根據須要本身增長新的具體構件子類和具體裝飾子類。

  缺點:

    a. 產生不少小對象,大量小對象佔據內存,必定程度上影響性能;

    b. 裝飾模式易於出錯,調試排查比較麻煩。

5、裝飾模式實際開發應用場景

  (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)…………

相關文章
相關標籤/搜索