一襟雷、基本概念
1.1 定義
為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。
1.2 例子
代理模式的角色分為以下幾種:
- 抽象主題類
Subject
:聲明真實(shí)主題與代理的共同接口方法矫夷。
/**
* 抽象主題類。
*
* @author lizejun
**/
public abstract class Subject {
/**
* 業(yè)務(wù)方法。
*/
public abstract void visit();
}
- 真實(shí)主題類
RealSubject
:定義了代理所表示的真實(shí)對(duì)象,由其執(zhí)行具體的業(yè)務(wù)邏輯方法埋涧,客戶類通過(guò)代理類間接地調(diào)用真實(shí)主題類中定義的方法。
/**
* 實(shí)現(xiàn)抽象主題的真實(shí)主題類搀绣。
*
* @author lizejun
**/
public class RealSubject extends Subject {
@Override
public void visit() {
Log.d("RealSubject", "visit()");
}
}
- 代理類
ProxySubject
:該類持有一個(gè)對(duì)真實(shí)主題類RealSubject
的引用,在其所實(shí)現(xiàn)的接口方法中調(diào)用真實(shí)主題類中相應(yīng)的接口方法執(zhí)行戳气。
/**
* 代理類链患。
*
* @author lizejun
**/
public class ProxySubject extends Subject {
private Subject mSubject;
public ProxySubject(Subject subject) {
mSubject = subject;
}
@Override
public void visit() {
mSubject.visit();
}
}
1.3 代理模式的使用場(chǎng)景
當(dāng)無(wú)法或不想直接訪問(wèn)某個(gè)對(duì)象或訪問(wèn)某個(gè)對(duì)象存在困難時(shí),可以通過(guò)一個(gè)代理對(duì)象來(lái)間接訪問(wèn)瓶您,為了保證客戶端使用的透明性麻捻,委托對(duì)象與代理對(duì)象 需要 實(shí)現(xiàn)相同的接口。
1.4 代理模式優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 協(xié)調(diào)調(diào)用者和被調(diào)用者呀袱,降低系統(tǒng)的耦合贸毕。
- 起到中介的作用,保護(hù)目標(biāo)對(duì)象夜赵。
缺點(diǎn)
- 需要額外的工作明棍。
- 在調(diào)用者和真實(shí)對(duì)象之間增加了代理對(duì)象,有可能導(dǎo)致請(qǐng)求變慢寇僧。
二摊腋、Android 源碼
在之前的文章中,我們已經(jīng)在源碼當(dāng)中接觸過(guò)兩種代理模式嘁傀,這里就不再重復(fù)說(shuō)明了兴蒸,有興趣的可以看下面這兩篇文章:
- 靜態(tài)代理:Framework 源碼解析知識(shí)梳理(1) - 應(yīng)用進(jìn)程與 AMS 的通信實(shí)現(xiàn)
- 動(dòng)態(tài)代理:Retrofit 知識(shí)梳理(2) - Retrofit 動(dòng)態(tài)代理內(nèi)部實(shí)現(xiàn)
三、項(xiàng)目應(yīng)用
待補(bǔ)充细办。
四橙凳、參考文獻(xiàn)
- <<
Android
源碼設(shè)計(jì)模式 - 解析與實(shí)戰(zhàn)>>