—前序:本文为《Androdi源码及开发模式》的学习笔记。
1、定义:
为其他对象提供一种代理以控制对这个对象的访问。
2、使用场景:
- 当无法或不想直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问 ,为了保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口。
- 当要对某个对象的实现方法时,要对其前后做操作,但又不想改变它原有对象,这时就要用到代理。
3、UML图:
代码实现:
公共接口 Subject:
public interface Subject {
void visit();
}
真正主题类:
public class RealSubject implements Subject {
//RealSubject的实现
@Override
public void visit() {
System.out.print("RealSubject visit");
}
}
代理类:
public class ProxyObject implements Subject {
Subject mSubject = null;
public ProxyObject(Subject subject) {
mSubject = subject;//持有要被代理的Subject
}
@Override
public void visit() {
mSubject.visit(); //实际调用的是被代理这的实现
}
}
使用:
RealSubject realSubject = new RealSubject();
ProxyObject proxyObject = new ProxyObject(realSubject);
proxyObject.vistit();
4、例子:
张三在大城市苦逼地敲了几年代码,终于赚够钱回老家盖房子了。盖房子要搭框架,砌砖,水电,装修。张三虽然也是搬砖的,但是是在电脑上啊,他不可能自己去建房子啊,那怎么办呐,那就要找工人帮忙建啊。
建房子的接口类:
public interface IBuildHouse {
void framework(); //搭框架
void bricking(); //砌砖
void waterElectricity(); // 水电
void fitment(); //装修
}
张三: 真正建房子的人:
public class ZhangSan implements IBuildHouse {
@Override
public void framework() {
System.out.print("搭框架");
}
@Override
public void bricking() {
System.out.print("砌砖");
}
@Override
public void waterElectricity() {
System.out.print("安装水电");
}
@Override
public void fitment() {
System.out.print("装修");
}
}
工人: 代理建房子的人
public class Worker implements IBuildHouse {
IBuildHouse mIBuildHouse;
//持有要建房子的对象
public Worker(IBuildHouse iBuildHouse) {
mIBuildHouse = iBuildHouse;
}
@Override
public void framework() {
mIBuildHouse.framework();
}
@Override
public void bricking() {
mIBuildHouse.bricking();
}
@Override
public void waterElectricity() {
mIBuildHouse.waterElectricity();
}
@Override
public void fitment() {
mIBuildHouse.fitment();
}
}
开始建房子:
Worker worker = new Worker(new ZhangSan());
worker.framework();
worker.bricking();
worker.waterElectricity();
worker.fitment();
5、代理模式的好处:
代理模式的好处就是对外部提供统一的接口方法,而代理类在接口中实现对真实的类的附加操作,从而可以在不影响外部调用的情况下,进行系统的扩展。
也就是说,我要修改真实角色的操作的时候,尽量不要修改它,而是在外部再包一层进行附加行为。即代理类。从而达到了“对修改关闭,扩展开放”的原则,保证了系统的稳定性。
6、Android中的使用:
在Android开发中,经常会用到代理模式。譬如现在的主流MVP框架。我在View层要加载一张图片,那我不可能在View层做这些操作,那我就要委托给P层去处理。因为加载图片是耗时操作,那我肯定要在加载图片放到另外一个线程处理,而加载完成之前要弹一个Loading框。而开启线程和弹loading框这些都是附加操作,View层是不管的,都是代理者P层器添加的。