设计模式读书笔记-----代理模式
? ? ? ?在我們實(shí)際生活中代理情況無(wú)處不在!你在淘寶上面買(mǎi)東西,你使用支付寶平臺(tái)支付,賣(mài)家請(qǐng)物流公司發(fā)貨、你請(qǐng)朋友幫你拿包裹,在這個(gè)過(guò)程匯總支付寶、物流公司、你朋友都扮演者“第三者”的角色在幫你完成物品的購(gòu)買(mǎi),這里的第三者我們可以將其稱(chēng)之為代理者。
所謂代理就通過(guò)引用一個(gè)新的對(duì)象來(lái)實(shí)現(xiàn)對(duì)真實(shí)對(duì)象的操作或者將新的對(duì)象當(dāng)做真實(shí)對(duì)象的一個(gè)替身,這種實(shí)現(xiàn)的機(jī)制就是代理模式,通過(guò)引用代理對(duì)象來(lái)訪問(wèn)真實(shí)對(duì)象就是代理模式的設(shè)計(jì)動(dòng)機(jī)。
? ? ? ?一、 模式定義
? ? ? ?代理模式就是給一個(gè)對(duì)象提供一個(gè)代理,并由代理對(duì)象控制對(duì)原對(duì)象的引用。
? ? ? ?在代理模式中,“第三者”代理主要是起到一個(gè)中介的作用,它連接客戶端和目標(biāo)對(duì)象。
? ? ? ?二、 模式結(jié)構(gòu)
? ? ? ?下圖是代理模式UML結(jié)構(gòu)圖
? ? ? ?在代理模式中有如下三個(gè)角色:
? ? ? ?Subject: 抽象角色。聲明真實(shí)對(duì)象和代理對(duì)象的共同接口。
? ? ? ?Proxy: 代理角色。代理對(duì)象與真實(shí)對(duì)象實(shí)現(xiàn)相同的接口,所以它能夠在任何時(shí)刻都能夠代理真實(shí)對(duì)象。代理角色內(nèi)部包含有對(duì)真實(shí)對(duì)象的引用,所以她可以操作真實(shí)對(duì)象,同時(shí)也可以附加其他的操作,相當(dāng)于對(duì)真實(shí)對(duì)象進(jìn)行封裝。
? ? ? ?RealSubject: 真實(shí)角色。它代表著真實(shí)對(duì)象,是我們最終要引用的對(duì)象
? ? ? ?三、 模式實(shí)現(xiàn)
? ? ? ?讀大學(xué)的時(shí)候都追過(guò)女生吧!某天你看到一位美女,一見(jiàn)鐘情,心里發(fā)誓要她做你女朋友。但是你想這樣直接上去可能會(huì)唐突了。于是你采用迂回政策,先和她室友搞好關(guān)系,然后通過(guò)她室友給她禮物,然后……。
? ? ? ?首先出現(xiàn)的就是美女一枚:BeautifulGirl.java
public class BeautifulGirl {String name;public BeautifulGirl(String name){this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}}
? ? ? ?然后是抽象主題,送禮物接口:GiveGift.java
public interface GiveGift {/*** 送花*/void giveFlowers();/*** 送巧克力*/void giveChocolate();/*** 送書(shū)*/void giveBook(); }
? ? ? ?你小子:You.java
public class You implements GiveGift {BeautifulGirl mm ; //美女public You(BeautifulGirl mm){this.mm = mm;}public void giveBook() {System.out.println(mm.getName() +",送你一本書(shū)....");}public void giveChocolate() {System.out.println(mm.getName() + ",送你一盒巧克力....");}public void giveFlowers() {System.out.println(mm.getName() + ",送你一束花....");}}
? ? ? ?她閨蜜室友:HerChum.java
public class HerChum implements GiveGift{You you;public HerChum(BeautifulGirl mm){you = new You(mm);}public void giveBook() {you.giveBook();}public void giveChocolate() {you.giveChocolate();}public void giveFlowers() {you.giveFlowers();}}
? ? ? ?客戶端:Client.java
public class Client {public static void main(String[] args) {BeautifulGirl mm = new BeautifulGirl("小屁孩...");HerChum chum = new HerChum(mm);chum.giveBook();chum.giveChocolate();chum.giveFlowers();} }
? ? ? ?運(yùn)行結(jié)果
? ? ? ?小屁孩...,送你一本書(shū)....
? ? ? ?小屁孩...,送你一盒巧克力....
? ? ? ?小屁孩...,送你一束花....
? ? ? ?好了禮物已經(jīng)送出去了,能不能搞定就看你的魅力了!!!!
? ? ? ?四、 模式優(yōu)缺點(diǎn)
? ? ? ?優(yōu)點(diǎn)
? ? ? ?1、 代理模式能夠協(xié)調(diào)調(diào)用者和被調(diào)用者,在一定程度上降低了系統(tǒng)的耦合度。
? ? ? ?2、 代理對(duì)象可以在客戶端和目標(biāo)對(duì)象之間起到中介的作用,這樣起到了的作用和保護(hù)了目標(biāo)對(duì)象的
? ? ? ?缺點(diǎn)
? ? ? ?1、由于在客戶端和真實(shí)主題之間增加了代理對(duì)象,因此有些類(lèi)型的代理模式可能會(huì)造成請(qǐng)求的處理速度變慢。
? ? ? ?2、 實(shí)現(xiàn)代理模式需要額外的工作,有些代理模式的實(shí)現(xiàn)非常復(fù)雜。
? ? ? ?五、 模式適用場(chǎng)景
? ? ? ?1、 遠(yuǎn)程代理:為一個(gè)對(duì)象在不同的地址空間提供局部代表。這樣可以隱藏一個(gè)對(duì)象存在于不同地址空間的事實(shí)。
? ? ? ?2、 虛擬代理:通過(guò)使用過(guò)一個(gè)小的對(duì)象代理一個(gè)大對(duì)象。這樣就可以減少系統(tǒng)的開(kāi)銷(xiāo)。
? ? ? ?3、 保護(hù)代理:用來(lái)控制對(duì)真實(shí)對(duì)象的訪問(wèn)權(quán)限。
? ? ? ?六、 模式總結(jié)
? ? ? ?1、代理模式是通過(guò)使用引用代理對(duì)象來(lái)訪問(wèn)真實(shí)對(duì)象,在這里代理對(duì)象充當(dāng)用于連接客戶端和真實(shí)對(duì)象的中介者。
? ? ? ?2、代理模式主要用于遠(yuǎn)程代理、虛擬代理和保護(hù)代理。其中保護(hù)代理可以進(jìn)行訪問(wèn)權(quán)限控制。
轉(zhuǎn)載于:https://www.cnblogs.com/oversea201405/p/3752115.html
總結(jié)
以上是生活随笔為你收集整理的设计模式读书笔记-----代理模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 在Eclipse中导入dtd和xsd文件
- 下一篇: ASP.NET MVC 5 学习教程:D