前言

      面向?qū)ο缶幊套非蟮谋举|(zhì)-提高擴(kuò)展性、可維護(hù)性、靈活性和復(fù)用性。合理利用面向?qū)ο?個(gè)原則,能夠很好的達(dá)到要求。如何利用好就是至關(guān)重要的了,前人總結(jié)了23+個(gè)設(shè)計(jì)模式能夠讓初學(xué)者更容易學(xué)到其中的精髓,本文就說(shuō)說(shuō)我對(duì)本人對(duì)裝飾模式與代理模式的見(jiàn)解。

設(shè)計(jì)模式鏈接

  1. 對(duì)設(shè)計(jì)模式的總結(jié)之原則

  2. 對(duì)設(shè)計(jì)模式的總結(jié)之簡(jiǎn)單工廠與策略模式

  3. 對(duì)設(shè)計(jì)模式的總結(jié)之裝飾模式與代理模式

裝飾模式與代理模式

裝飾模式

      項(xiàng)目中要實(shí)現(xiàn)某個(gè)功能,前提條件是:1、該功能由許多單一功能的小功能組合而成;2、該功能中需要實(shí)現(xiàn)可靈活改變內(nèi)部小功能的執(zhí)行順序;3、該功能內(nèi)部的小功能不是固定的;4、用面向?qū)ο笤O(shè)計(jì)編程。

      就比如裝修房子:首先房子整體風(fēng)格有多種,什么歐式風(fēng)格,田園風(fēng)格,地中海風(fēng)格。每種風(fēng)格中所用的家具種類(lèi)和家具數(shù)量也不一樣。要實(shí)現(xiàn)這個(gè)裝修功能,咋個(gè)整啦?

      有人會(huì)馬上想到:繼承,先建立兩個(gè)抽象類(lèi)(選擇裝修風(fēng)格抽象和家具裝修抽象)。具體風(fēng)格類(lèi)繼承裝修風(fēng)格抽象類(lèi),具體家具類(lèi)繼承家具裝修抽象類(lèi),客戶(hù)端先選用具體風(fēng)格,在更具具體風(fēng)格去調(diào)用具體家具裝飾。這樣子看起來(lái)還不錯(cuò),但是當(dāng)風(fēng)格和家具多了,而且每種風(fēng)格的家具又是可變的,后期擴(kuò)展又都會(huì)去更改抽象就很麻煩。

      有處理這種特殊例子的好辦法嗎?有,那就是裝飾者模式。在不必改變?cè)?lèi)文件和使用繼承的情況下,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對(duì)象的功能。它是通過(guò)創(chuàng)建一個(gè)包裝對(duì)象,也就是裝飾來(lái)包裹真實(shí)的對(duì)象。

       平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫(huà)培訓(xùn)

基本用法

  1. 平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫(huà)培訓(xùn) View Code

總結(jié)

      問(wèn)題:為什么裝飾者模式里面有繼承,為什么又不用啦?

      回答:這就是裝飾者模式一大優(yōu)點(diǎn),這里抽象只做類(lèi)型規(guī)范作用,不實(shí)現(xiàn)方法的復(fù)制。裝飾者和被裝飾者是同一個(gè)類(lèi)型,這樣被裝飾者擁有了裝飾者獨(dú)有的功能。這樣子我們可以在任何時(shí)候,給新的裝飾者增加新的行為。如果是用繼承,每當(dāng)需要增加新的行為時(shí),就要修改原程序的基類(lèi)了。

      優(yōu)缺點(diǎn):

  1. 被裝飾者和裝飾者繼承同一個(gè)基類(lèi),客戶(hù)端可以用一種方式與裝飾者和被裝飾者交互。

  2. 裝飾者和被裝飾者是同一個(gè)類(lèi)型,這樣被裝飾者擁有了裝飾者獨(dú)有的功能。

  3. 裝飾者模式是用繼承對(duì)象規(guī)定類(lèi)型,不做方法復(fù)制,提高了靈活性。

  4. 客戶(hù)端可以隨意選擇裝飾者,組合成個(gè)數(shù)、排列不同的組合,提高了靈活性。

  5. 增加了提高了編碼復(fù)雜度。

      使用場(chǎng)景:

  1. 需要擴(kuò)展一個(gè)類(lèi)的功能,或給一個(gè)類(lèi)添加附加職責(zé)。

  2. 需要靈活動(dòng)態(tài)添加/排序/減少功能。

  3. 整個(gè)功能不同組合都會(huì)生成大類(lèi)子類(lèi)的情況。

代理模式

      畢業(yè)季到了,許多同學(xué)也將結(jié)束啃老族的生活,步入社會(huì)的大家庭自力更生-找工作。在以前,同學(xué)們就是頻繁的進(jìn)出各個(gè)人才招聘市場(chǎng),每天都累成死狗一樣,最后效果還不咋滴。近年來(lái),招聘中介網(wǎng)步入人才市場(chǎng),很好的解決了招聘單位和被招聘者費(fèi)時(shí)費(fèi)力卻都不如意的問(wèn)題。

      在軟件設(shè)計(jì)中,由于某些情況,客戶(hù)端不想或不能直接訪問(wèn)一個(gè)對(duì)象,此時(shí)可以通過(guò)一個(gè)稱(chēng)為“代理”的角色來(lái)實(shí)現(xiàn)間接訪問(wèn),該方案對(duì)應(yīng)的設(shè)計(jì)模式被稱(chēng)為代理模式(給某一個(gè)對(duì)象提供一個(gè)代理或占位符,并由代理對(duì)象來(lái)控制對(duì)原對(duì)象的訪問(wèn))。代理模式是一種應(yīng)用很廣泛的結(jié)構(gòu)型設(shè)計(jì)模式,而且變化形式非常多,常見(jiàn)的代理形式包括遠(yuǎn)程代理、保護(hù)代理、虛擬代理、緩沖代理、職能引用代理等。

      代理模式分類(lèi):

  1. 遠(yuǎn)程代理(Remote Proxy):為一個(gè)位于不同的地址空間的對(duì)象提供一個(gè)本地的代理對(duì)象,這個(gè)不同的地址空間可以是在同一臺(tái)主機(jī)中,也可是在另一臺(tái)主機(jī)中(eg:WebService,WCF之類(lèi)的)。

  2. 虛擬代理(Virtual Proxy):如果需要?jiǎng)?chuàng)建一個(gè)資源消耗較大的對(duì)象,先創(chuàng)建一個(gè)消耗相對(duì)較小的對(duì)象來(lái)表示,真實(shí)對(duì)象只在需要時(shí)才會(huì)被真正創(chuàng)建(eg:瀏覽器分階段載入信息,先文字再圖片)。

  3. 保護(hù)代理(Protect Proxy):控制對(duì)一個(gè)對(duì)象的訪問(wèn),可以給不同的用戶(hù)提供不同級(jí)別的使用權(quán)限(eg:多級(jí)權(quán)限系統(tǒng))。

  4. 緩沖代理(Cache Proxy):為某一個(gè)目標(biāo)操作的結(jié)果提供臨時(shí)的存儲(chǔ)空間,以便多個(gè)客戶(hù)端可以共享這些結(jié)果(eg:訪問(wèn)頻繁時(shí)用的緩沖機(jī)制)。

  5. 智能引用代理(Smart Reference Proxy):當(dāng)一個(gè)對(duì)象被引用時(shí),提供一些額外的操作,例如將對(duì)象被調(diào)用的次數(shù)記錄下來(lái)等。

      平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫(huà)培訓(xùn)

 

基本用法

      業(yè)務(wù)需求:系統(tǒng)中需要一個(gè)角色與各種游戲服務(wù)端交互的功能,在交互之前必須回去權(quán)限,在交互之后要統(tǒng)計(jì)交互信息。

  1. 平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開(kāi)發(fā),動(dòng)畫(huà)培訓(xùn) View Code

總結(jié)

      優(yōu)缺點(diǎn):

  1. 客戶(hù)通過(guò)代理調(diào)用功能,降低了耦合性。

  2. 更改代理,可以搭配出許多功能,增加了代碼靈活性和可擴(kuò)展性。

  3. 遠(yuǎn)程代理可以將功能分散到其他服務(wù)端,提高系統(tǒng)效率;緩存代理可使高頻率訪問(wèn)對(duì)象訪問(wèn)速率更快;保護(hù)代理可以控制訪問(wèn)權(quán)限。

  4. 在使用者和被使用者中間加了代理,在一定程度上降低了處理速率。

      使用場(chǎng)景:

  1. 當(dāng)客戶(hù)端對(duì)象需要訪問(wèn)遠(yuǎn)程主機(jī)中的對(duì)象時(shí)可以使用遠(yuǎn)程代理。

  2. 當(dāng)需要用一個(gè)消耗資源較少的對(duì)象來(lái)代表一個(gè)消耗資源較多的對(duì)象,從而降低系統(tǒng)開(kāi)銷(xiāo)、縮短運(yùn)行時(shí)間時(shí)可以使用虛擬代理,例如一個(gè)對(duì)象需要很長(zhǎng)時(shí)間才能完成加載時(shí)。

  3. 當(dāng)需要為某一個(gè)被頻繁訪問(wèn)的操作結(jié)果提供一個(gè)臨時(shí)存儲(chǔ)空間,以供多個(gè)客戶(hù)端共享訪問(wèn)這些結(jié)果時(shí)可以使用緩沖代理。

  4. 當(dāng)需要控制對(duì)一個(gè)對(duì)象的訪問(wèn),為不同用戶(hù)提供不同級(jí)別的訪問(wèn)權(quán)限時(shí)可以使用保護(hù)代理。

  5. 當(dāng)需要為一個(gè)對(duì)象的訪問(wèn)(引用)提供一些額外的操作時(shí)可以使用智能引用代理。

裝飾模式與代理模式區(qū)別

     從UML類(lèi)圖可以看出來(lái),裝飾模式和代理模式在結(jié)構(gòu)上很相似。都是真實(shí)類(lèi)與代理/裝飾繼承同一個(gè)基類(lèi)。那它們又有何差別啦?

     使用代理模式,代理和真實(shí)對(duì)象之間的的關(guān)系通常在編譯時(shí)就已經(jīng)確定了,而裝飾者能夠在運(yùn)行時(shí)動(dòng)態(tài)的被構(gòu)造。代理模式中,代理類(lèi)對(duì)被代理的對(duì)象有控制權(quán),決定其執(zhí)行或者不執(zhí)行。而裝飾模式中,裝飾類(lèi)對(duì)代理對(duì)象沒(méi)有控制權(quán),只能為其增加一層裝飾,以加強(qiáng)被裝飾對(duì)象的功能。

http://www.cnblogs.com/harveybarray/p/6821680.html