日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

设计模式(二)__装饰设计模式

發布時間:2025/7/25 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式(二)__装饰设计模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天呢,來給大家介紹一下裝飾設計模式,java中IO就使用到了這個模式。

  裝飾設計模式,顧名思義,就是對一個功能進行裝飾,就跟女人化妝一樣,人還是本人,但是化了妝就變得比原來更漂亮了。

  需求:當你有個功能是在N年前建立的,如今老大覺得功能不夠用了,需要進行增強,那么怎么辦呢?

  解決:你就可以定義類,將已有對象傳入,基于已有的功能,并提供加強功能。如果這個功能寫錯了,又可以把自己寫的功能去掉而不影響以前的功能,是不是很靈活啊。這個類就是裝飾類。

  裝飾設計模式呢,主要是對一組類進行功能的增強

  那么什么時候會用到裝飾模式呢?

  1.需要擴展一個類的功能,或給一個類增加附加責任

  2.需要動態的給一個對象增加功能,這些功能可以再動態的撤銷

  3.需要增加由一些基本功能的排列組合而產生的非常大量的功能,從而使繼承關系變得不現實

好了,上菜了。

(由于本人比較笨,想不出什么比較恰當的例子,這里就借鑒一下http://blog.csdn.net/furongkang/article/details/7214100中的例子。什么?你說我懶? 哼,好吧,我承認我懶。)

?

1 /* 2 3 我家里有兩套房子:平房,樓房。 4 5 House 6 |--PingFang 7 |--LouFang 8 9 可是像我這么土豪,又具有強烈的文藝范,又有眾多妻妾。。。 相信你已經感覺到了我的霸王之氣。 10 所以: 11 1,對平房進行田園風光式的打造。 12 2,對樓房進行歐式風格的打造。 13 可以通過繼承的方式來完成。 14 15 House 16 |--PingFang 17 |--TianYuanPingFang 18 |--LouFang 19 |--OuShiLouFang 20 21 */ 22 abstract class House { 23 abstract void show(); 24 } 25 26 class PingFang extends House { 27 public void show() { 28 System.out.println("平房"); 29 } 30 } 31 32 class TianYuanPingFang extends PingFang { 33 public void showTianYuan() { 34 super.show(); 35 System.out.println("田園風格"); 36 } 37 } 38 39 class LouFang extends House { 40 public void show() { 41 System.out.println("樓房"); 42 } 43 } 44 45 class OuShiLouFang extends LouFang { 46 public void showOuShi() { 47 super.show(); 48 System.out.println("歐式風格"); 49 } 50 } 51 52 class HouseDemo { 53 public static void main(String[] args) { 54 PingFang p = new PingFang(); 55 // p.show(); 56 57 TianYuanPingFang t = new TianYuanPingFang(); 58 t.showTianYuan(); 59 60 LouFang l = new LouFang(); 61 // l.show(); 62 OuShiLouFang o = new OuShiLouFang(); 63 o.showOuShi(); 64 } 65 }

?

  上面的代碼實現了我需要的功能,但是如果單單為了某個功能而去繼承,那么那個體系是非常臃腫的。你說感覺不出來?假如你有幾百個類,那么就會需要再寫上幾百個子類去繼承。能累死個人。

  裝飾模式比繼承要靈活。避免了繼承體系臃腫。而且降低了類于類之間的關系。裝飾類因為增強已有對象,具備的功能和已有的是相同的,只不過提供了更強功能。所以裝飾類和被裝飾類通常是都屬于一個體系中的。

  裝飾類通常會通過構造方法接收被裝飾的對象。并基于被裝飾的對象的功能,提供更強的功能。

使用裝飾設計模式進行裝飾:

1 /* 2 原體系: 3 House 4 |--PingFang 5 |--LouFang 6 7 通過繼承之后的體系 8 House 9 |--PingFang 10 |--TianYuanPingFang 11 |--LouFang 12 |--OuShiLouFang 13 14 無論將平房打造成田園還是歐式,都是對平房一種裝修。 15 而該裝修也可以用樓房。 16 17 將現將該裝修定義好,需要把什么房子進行改裝修,傳入即可。 18 House 19 |--PingFang 20 |--LouFang 21 |--TianYuan 22 |--OuShi 23 24 */ 25 abstract class House { 26 abstract void show(); 27 } 28 29 class PingFang extends House { 30 public void show() { 31 System.out.println("平房"); 32 } 33 } 34 35 class LouFang extends House { 36 public void show() { 37 System.out.println("樓房"); 38 } 39 } 40 41 class TianYuan extends House { 42 43 private House h; 44 45 TianYuan(House h) { 46 this.h = h; 47 } 48 49 public void show() { 50 System.out.println("田園風格"); 51 } 52 53 public void showTianYuan() { 54 h.show(); 55 this.show(); 56 } 57 58 } 59 60 class OuShi extends House { 61 private House h; 62 63 OuShi(House h) { 64 this.h = h; 65 } 66 67 public void show() { 68 System.out.println("歐式風格"); 69 } 70 71 public void showOuShi() { 72 h.show(); 73 this.show(); 74 } 75 76 } 77 78 class HouseDemo2 { 79 public static void main(String[] args) { 80 PingFang p = new PingFang(); 81 LouFang l = new LouFang(); 82 83 OuShi o = new OuShi(new TianYuan(p)); 84 o.showOuShi(); 85 86 // TianYuan t = new TianYuan(l); 87 // t.showTianYuan(); 88 89 // OuShi o = new OuShi(l); 90 // o.showOuShi(); 91 } 92 }

是不是好了很多呢。

轉載于:https://www.cnblogs.com/makaruila/p/4851683.html

總結

以上是生活随笔為你收集整理的设计模式(二)__装饰设计模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。