设计模式(二)__装饰设计模式
今天呢,來(lái)給大家介紹一下裝飾設(shè)計(jì)模式,java中IO就使用到了這個(gè)模式。
裝飾設(shè)計(jì)模式,顧名思義,就是對(duì)一個(gè)功能進(jìn)行裝飾,就跟女人化妝一樣,人還是本人,但是化了妝就變得比原來(lái)更漂亮了。
需求:當(dāng)你有個(gè)功能是在N年前建立的,如今老大覺得功能不夠用了,需要進(jìn)行增強(qiáng),那么怎么辦呢?
解決:你就可以定義類,將已有對(duì)象傳入,基于已有的功能,并提供加強(qiáng)功能。如果這個(gè)功能寫錯(cuò)了,又可以把自己寫的功能去掉而不影響以前的功能,是不是很靈活啊。這個(gè)類就是裝飾類。
裝飾設(shè)計(jì)模式呢,主要是對(duì)一組類進(jìn)行功能的增強(qiáng)。
那么什么時(shí)候會(huì)用到裝飾模式呢?
1.需要擴(kuò)展一個(gè)類的功能,或給一個(gè)類增加附加責(zé)任
2.需要?jiǎng)討B(tài)的給一個(gè)對(duì)象增加功能,這些功能可以再動(dòng)態(tài)的撤銷
3.需要增加由一些基本功能的排列組合而產(chǎn)生的非常大量的功能,從而使繼承關(guān)系變得不現(xiàn)實(shí)
好了,上菜了。
(由于本人比較笨,想不出什么比較恰當(dāng)?shù)睦?#xff0c;這里就借鑒一下http://blog.csdn.net/furongkang/article/details/7214100中的例子。什么?你說(shuō)我懶? 哼,好吧,我承認(rèn)我懶。)
?
1 /* 2 3 我家里有兩套房子:平房,樓房。 4 5 House 6 |--PingFang 7 |--LouFang 8 9 可是像我這么土豪,又具有強(qiáng)烈的文藝范,又有眾多妻妾。。。 相信你已經(jīng)感覺到了我的霸王之氣。 10 所以: 11 1,對(duì)平房進(jìn)行田園風(fēng)光式的打造。 12 2,對(duì)樓房進(jìn)行歐式風(fēng)格的打造。 13 可以通過(guò)繼承的方式來(lái)完成。 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("田園風(fēng)格"); 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("歐式風(fēng)格"); 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 }?
上面的代碼實(shí)現(xiàn)了我需要的功能,但是如果單單為了某個(gè)功能而去繼承,那么那個(gè)體系是非常臃腫的。你說(shuō)感覺不出來(lái)?假如你有幾百個(gè)類,那么就會(huì)需要再寫上幾百個(gè)子類去繼承。能累死個(gè)人。
裝飾模式比繼承要靈活。避免了繼承體系臃腫。而且降低了類于類之間的關(guān)系。裝飾類因?yàn)樵鰪?qiáng)已有對(duì)象,具備的功能和已有的是相同的,只不過(guò)提供了更強(qiáng)功能。所以裝飾類和被裝飾類通常是都屬于一個(gè)體系中的。
裝飾類通常會(huì)通過(guò)構(gòu)造方法接收被裝飾的對(duì)象。并基于被裝飾的對(duì)象的功能,提供更強(qiáng)的功能。
使用裝飾設(shè)計(jì)模式進(jìn)行裝飾:
1 /* 2 原體系: 3 House 4 |--PingFang 5 |--LouFang 6 7 通過(guò)繼承之后的體系 8 House 9 |--PingFang 10 |--TianYuanPingFang 11 |--LouFang 12 |--OuShiLouFang 13 14 無(wú)論將平房打造成田園還是歐式,都是對(duì)平房一種裝修。 15 而該裝修也可以用樓房。 16 17 將現(xiàn)將該裝修定義好,需要把什么房子進(jìn)行改裝修,傳入即可。 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("田園風(fēng)格"); 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("歐式風(fēng)格"); 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 }是不是好了很多呢。
轉(zhuǎn)載于:https://www.cnblogs.com/makaruila/p/4851683.html
總結(jié)
以上是生活随笔為你收集整理的设计模式(二)__装饰设计模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vs2015使用GIt连接git.osc
- 下一篇: 开源 java CMS - FreeCM