概念
為其它對象提供一種代理以控制對這個對象的訪問
舉個栗子
小黃想要追求小紅,但是不認識小紅,剛好他的朋友小李認識小紅,小黃通過小李去追求小紅,這個過程就是代理模式.
來看看UML圖.
image
先定義一個追求接口
public interface request {
void Flowers();
void Babe();
void Chocolat();
}
讓小黃和小李都實現(xiàn)它,
//小黃,追求者
public class Pursuit implements request {
private Girl girl;
public Pursuit(Girl girl){
this.girl = girl;
}
@Override
public void Flowers() {
System.out.println(girl.name + "送花");
}
@Override
public void Babe() {
System.out.println(girl.name + "送芭比");
}
@Override
public void Chocolat() {
System.out.println(girl.name + "送巧克力");
}
}
//小李,代理者
public class Proxy implements request {
private Pursuit pursuit;
public Proxy(Girl girl){
//代理
pursuit = new Pursuit(girl);
}
...request接口
}
//Girl類無所謂,有個名字就成.
Android中的代理模式.
Binder
機制
眾所周知,Binder
存在的原因是為了進程間通訊.我們從進程A去訪問進程B時,需要通過Binder
機制去訪問.
Binder
是標準的C/S模式.那么可以這么理解,有兩個進程Client
和Server
,,誰請求誰就是進程Client
,誰被請求誰就是進程Server
.但是我們并沒有權(quán)限去自己訪問Server
,而是通過Binder
去代替我們?nèi)フ埱?code>Server,然后返回Server
的代理,我們通過這個代理去操作,這樣通過代理的方式無疑確保了系統(tǒng)的安全性.
否則以Android剪切板為栗,如果不是通過代理去訪問,而是自己擁有訪問的權(quán)限,我們在自己的APP中去修改剪切板,隨之改變的,是整個系統(tǒng),所有APP的剪切板都會改變,無疑這樣是不允許的.而通過代理,就算你改變了這個APP中的剪切板,但是并不影響其他的APP.
比如說,我現(xiàn)在要請求服務(wù)中的一個add
方法,我需要通過Binder
去請求SM(ServiceManager)
,然后返回這個add
方法的代理.看圖說話.
image
我們可以非常清晰地看到這個代理的全過程.
結(jié)語
有錯請指出,謝謝.
學無止境.