概念
为其它对象提供一种代理以控制对这个对象的访问
举个栗子
小黄想要追求小红,但是不认识小红,刚好他的朋友小李认识小红,小黄通过小李去追求小红,这个过程就是代理模式.
来看看UML图.
先定义一个追求接口
public interface request {
void Flowers();
void Babe();
void Chocolat();
}
让小黄和小李都实现它,
//小黄,追求者
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
.但是我们并没有权限去自己访问Server
,而是通过Binder
去代替我们去请求Server
,然后返回Server
的代理,我们通过这个代理去操作,这样通过代理的方式无疑确保了系统的安全性.
否则以Android剪切板为栗,如果不是通过代理去访问,而是自己拥有访问的权限,我们在自己的APP中去修改剪切板,随之改变的,是整个系统,所有APP的剪切板都会改变,无疑这样是不允许的.而通过代理,就算你改变了这个APP中的剪切板,但是并不影响其他的APP.
比如说,我现在要请求服务中的一个add
方法,我需要通过Binder
去请求SM(ServiceManager)
,然后返回这个add
方法的代理.看图说话.
我们可以非常清晰地看到这个代理的全过程.
结语
有错请指出,谢谢.
学无止境.