『设计模式』小老弟你猜不透我?-- 代理模式
23種設(shè)計(jì)模式+額外常用設(shè)計(jì)模式匯總 (持續(xù)更新)
代理模式
代理模式(proxy)模式給某一個(gè)對象提供一個(gè)替身或占位符,以控制對這個(gè)對象的訪問。
所謂代理,就是一個(gè)人或者一個(gè)機(jī)構(gòu)代表另一個(gè)人或者另一個(gè)機(jī)構(gòu)采取行動(dòng)。在一些情況下,一個(gè)客戶不想或者不能夠直接引用一個(gè)對象,而代理對象可以在客戶端和目標(biāo)對象之間起到中介作用。
代理模式結(jié)構(gòu)
- 抽象主題(Subject)角色 聲明了真實(shí)主題和代理主題的共同接口,這樣一來在任何使用真實(shí)主題的地方都可以使用代理主題。
- 代理主題(Proxy)角色 代理主題角色內(nèi)部含有對真實(shí)主題的引用,從而可以再任何時(shí)候操作真實(shí)主題對象;代理主題角色提供一個(gè)與真實(shí)主題角色相同的接口,以便可以再任何時(shí)候都可以替代真實(shí)主題; 控制真實(shí)主題的應(yīng)用,負(fù)責(zé)在需要的時(shí)候創(chuàng)建真實(shí)主題對象(和刪除主題對象)
- 真實(shí)主題(RealSubject)角色 定義了代理角色所代表的真實(shí)對象
應(yīng)用場景:
1. 遠(yuǎn)程(Remote)代理
為一個(gè)位于不同的地址空間的對象提供一個(gè)局域代表對象。可以隱藏一個(gè)對象存在于不同地址空間的事實(shí)。這個(gè)不同的地址空間可以使在本機(jī)器中,也可是在另一臺(tái)機(jī)器中。遠(yuǎn)程代理又叫做大使。
可以將網(wǎng)絡(luò)的細(xì)節(jié)隱藏起來,使得客戶端不必考慮網(wǎng)絡(luò)的存在。客戶完全可以認(rèn)為被代理的對象是局域的而不是遠(yuǎn)程的,而代理對象承擔(dān)了大部分的網(wǎng)絡(luò)通信工作。
2. 虛擬(Virtual)代理
代理對象可以在必要的時(shí)候才將被代理的對象加載。代理可以對加載過程加以必要的優(yōu)化。當(dāng)一個(gè)模塊的加載十分耗費(fèi)資源的時(shí)候,虛擬代理的優(yōu)點(diǎn)就非常明顯。
應(yīng)用:
某個(gè)客戶端不能直接操作到某個(gè)對象,擔(dān)又必須和那個(gè)對象有所互動(dòng)。
對于開銷很大的對象,只有在使用它是才創(chuàng)建,這個(gè)原則可以為為我們節(jié)省很多寶貴的內(nèi)存資源。
3. 保護(hù)(Protect or Access)代理(安全代理)
可以在運(yùn)行時(shí)對用戶的有關(guān)權(quán)限進(jìn)行檢查,然后在核實(shí)后決定將調(diào)用傳遞給被代理的對象。
授權(quán)機(jī)制:不同級(jí)別的用戶對同一對象擁有不同的訪問權(quán)利。
4. 智能引用(Smart Reference)代理
當(dāng)一個(gè)對象唄引用是,提供一些額外的曹鎖,比如講對此對象調(diào)用的次數(shù)記錄下來等。
5. Copy-on-Wright代理
虛擬代理的一種。把復(fù)制(克隆)拖延到只有在哭護(hù)短需要時(shí),才真正采取行動(dòng)。
6. Cache代理
為那些昂貴操作的結(jié)果提供臨時(shí)的存儲(chǔ)空間,一遍多個(gè)客戶端可以共享這些結(jié)果。
7. 防火墻(Friewall)代理
保護(hù)目標(biāo),不讓惡意用戶接近。
8. 同步化(Synchronization)代理
使幾個(gè)用戶能夠同時(shí)訪問目標(biāo)對象而沒有沖突。
優(yōu)點(diǎn):
1.職責(zé)清晰。
2.高擴(kuò)展性。
3.智能化。
缺點(diǎn):
實(shí)現(xiàn):
抽象主題
真正的主題 需要被保護(hù)的
package Proxy;public class RealSubject extends Subject {@Overridepublic void requestA() {// TODO Auto-generated method stubSystem.out.println("真實(shí)的請求A ");}@Overridepublic void requestB() {// TODO Auto-generated method stubSystem.out.println("真實(shí)的請求B");}@Overridepublic void requestC() {// TODO Auto-generated method stubSystem.out.println("真實(shí)的請求C ");}}代理主題
package Proxy;public class Proxy extends Subject{RealSubject Rs;public void requestA() {if(Rs==null)Rs=new RealSubject();Rs.requestA();};public void requestB() {if(Rs==null)Rs=new RealSubject();Rs.requestC();};public void requestC() {if(Rs==null)Rs=new RealSubject();Rs.requestC();}; }客戶端
package Proxy;public class Client {public static void main(String[] args) {Proxy proxy =new Proxy();proxy.requestA();proxy.requestB();proxy.requestC();} }總結(jié)
以上是生活随笔為你收集整理的『设计模式』小老弟你猜不透我?-- 代理模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么关闭win10自动更新 关闭win1
- 下一篇: 已备案域名购买要注意什么