定義
為其他對象提供一種代理,以控制對這個對象的訪問;
結(jié)構(gòu)UML
整個的代理模式矢空,有面向接口編程的雛形,下面通過代碼禀横,對UML圖進行解析:
interface Subject {
fun request()
}
Subject是一個接口屁药,該接口定義了request方法。
class RealSubject : Subject {
override fun request() {
// do sth.
}
}
RealSubject繼承了Subject接口柏锄,實現(xiàn)其中的方法酿箭。
class Proxy : Subject {
val realSubject: RealSubject = RealSubject()
override fun request() {
realSubject.request()
}
}
代理也繼承了Subject接口,實現(xiàn)其中方法趾娃,同時缭嫡,還持有一個RealSubject的實例,實現(xiàn)的方法實質(zhì)就是調(diào)用RealSubject中的對應方法抬闷。
class Client {
fun startRequest() {
val proxy: Proxy = Proxy()
proxy.request()
}
}
調(diào)用時妇蛀,用戶只和代理Proxy進行交互,不必知曉真實操作的對象笤成。
應用實例
王小輝想租房子评架,但是房主身份神秘,從來沒有露面過炕泳,而是委托自己的律師與王小輝簽訂合同纵诞。在這之中神秘房主的律師就起到了代理的作用。
interface IRentHouse {
fun viewHouse()
fun payInAdvance()
fun signContract()
}
此時培遵,有一個租房的接口挣磨,IRentHouse。
class Landlord : IRentHouse {
override fun viewHouse() {
// 掏出房子鑰匙
}
override fun payInAdvance() {
// 收定金
}
override fun signContract() {
// 簽合同
}
}
房東Landlord實現(xiàn)了這個接口荤懂,具備看房茁裙、收定金和簽合同的具體功能。
class Proxy : IRentHouse {
val landlorder: Landlord = Landlord()
override fun viewHouse() {
landlorder.viewHouse()
}
override fun payInAdvance() {
landlorder.payInAdvance()
}
override fun signContract() {
landlorder.signContract()
}
}
房主的律師节仿,起到了代理的作用晤锥,代理房主完成看房、收錢和簽合同的功能廊宪。
class WangXiaoHui {
fun startRequest() {
val proxy: Proxy = Proxy()
proxy.viewHouse()
proxy.payInAdvance()
proxy.signContract()
}
}
王小輝只和律師(代理)進行交互泄隔,就能完成租房的全部流程,很好的隱藏了房主的信息贪染。
總結(jié)
代理模式四中分類
1涂乌、遠程代理
為一個對象,在不同的地址空間提供局部代理傅寡,可以隱藏一個對象存在于不同地址空間的事實放妈。比如WebService北救,由WebReference進行隱藏代理。
2芜抒、虛擬代理
根據(jù)需求創(chuàng)建開銷很大的對象珍策,通過它來存放實例化需要很長時間的真是對象,提升性能宅倒。比如打開很大的網(wǎng)頁攘宙,先看到文字,隨后圖片才一張張加載出來拐迁,未顯示的圖片框蹭劈,就是虛擬代理,代替了真實的圖片线召。
3铺韧、安全代理
用來控制真實對象的訪問權(quán)限。
4灶搜、智能指引
調(diào)用真實對象的方法的同時祟蚀,代理可以處理其他事務。