代理設計模式與裝飾設計模式的對比

寫上一篇文章的時候查了一下相關的資料,結果突然發現對於代理設計模式與裝飾設計模式有點混淆,百度搜索的結果也不是很明確,都是說代理設計模式重在對與代理對象的控制,而裝飾設計模式重在對裝飾對象的增強,其實這麼說沒有什麼問題,但是稍微抽象了一些,爲了便於理解,我們可以分別寫一下來對比看看。
其實在代理設計模式裏比較容易跟裝飾設計模式混淆的是靜態代理,兩個都是在被代理或者裝飾的對象外面套了一層,然後自己實現方法的時候調用成員變量的方法舉一個例子來說明一下:比如在一個異次元的古代,碰巧是封建帝制,大臣向皇帝呈摺子的時候需要經過太監來轉交,而這個皇帝比較昏庸,太監就爲非作歹,許多摺子就暗中扣下,不呈交皇帝,或者替換奏摺,翻譯成代碼就是下面這樣。

// 靜態代理
// 大臣,相當於被代理的類
public class DaChen {
  public String zouZhe() {
    return "啓稟皇上balabala";
  }
}
// 太監,相當於代理類
public class TaiJian {
  private DaChen daChen;
  public TaiJian(DaChen daChen) {
    this.daChen = daChen;
  }
  public String piYue() {
    Random random = new Random();
    // 太監看心情呈奏摺子
    if(random.nextBoolean()) {
      return daChen.zouZhe();
    } else {
      return "皇上,今天沒有摺子!";
    }
  }
}
// 皇上,最終結果
public class HuangShang {
  public static void main(String[] args) {
    // 大臣呈遞奏摺ing
    DaChen daChen = new DaChen();
    TaiJian taiJian = new TaiJian(daChen);
    // 皇上勤政ing
    for (int i = 0; i < 5; i++) {
      System.out.println(taiJian.piYue());
    }
  }
}
// 執行結果
皇上,今天沒有摺子!
皇上,今天沒有摺子!
皇上,今天沒有摺子!
啓稟皇上balabala
皇上,今天沒有摺子!

Process finished with exit code 0

五個摺子竟然只呈遞了一個,這個太監的心情不太好啊,從這裏可以明顯的看出代理的側重在控制上,他可以決定代理對象的執行與否,下面我們再看裝飾設計模式。還是同樣的場景,只不過是皇帝頒旨,太監去宣旨,那太監肯定是挑高大上的詞來說了。

// 裝飾設計模式
// 皇帝,相當於被裝飾的類
public class HuangShang {
  public String banZhi() {
    return "表現不錯,賞";
  }
}
// 太監,相當於裝飾類
public class TaiJian {
  private HuangShang huangShang;
  public TaiJian(HuangShang huangShang) {
    this.huangShang = huangShang;
  }
  public String xuanZhi() {
    System.out.println("奉天承運,皇帝詔曰:");
    return huangShang.banZhi();
  }
}
// 大臣,相當於調用裝飾的類
public class DaChen {
  public static void main(String[] args) {
    // 皇帝下旨ing
    HuangShang huangShang = new HuangShang();
    TaiJian taiJian = new TaiJian(huangShang);
    // 接旨ing
    System.out.println(taiJian.xuanZhi());
  }
}
// 結果
奉天承運,皇帝詔曰:
表現不錯,賞

Process finished with exit code 0

這裏可以看到,太監不敢矯造聖旨,所以聖旨內容沒有改變,只是在前面說了句“奉天承運,皇帝詔曰:”,這裏體現的就是裝飾設計模式的增強功能,並不會更改被裝飾對象的方法,而是增強他。
其實並沒有嚴格的規定要求代理不能增強,裝飾不能控制,只是說側重增強的是裝飾設計模式,側重控制的是代理,實際使用中也可以混用,設計模式就是爲了方便實現邏輯的,沒必要硬湊設計模式而放棄了簡便,所以說這兩者的區別就在於使用的意義側重。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章