代理模式在代码也会经常要用到,形象的比喻下代理模式,就像你要买房,由于你不熟悉当地的房产,所以需要找房产中介帮你忙,在这里你就相当于是委托对象,房产中介相当于代理类帮你去做你想要做的事。
使用场景:当无法或者不想直接访问某个对象时可以通过一个代理对象来间接访问。
我们看下代码方面是如何实现的,首先我们需要定义一个接口,这个接口由委托类和代理类一起实现;
接口:
public interface IBuyHouse {
abstract void seeHouse();
abstract void contract();
abstract void pay();
}
代理类:
public class AgencyProxy implements IBuyHouse {
private IBuyHouse mIBuyHouse;
public AgencyProxy(IBuyHouse bh) {
mIBuyHouse = bh;
}
@Override
public void seeHouse() {
mIBuyHouse.seeHouse();
}
@Override
public void contract() {
mIBuyHouse.contract();
}
@Override
public void pay() {
mIBuyHouse.pay();
}
}
委托类:
public class Customer implements IBuyHouse {
private static final String TAG = "Customer";
@Override
public void seeHouse() {
Log.d(TAG, "看房");
}
@Override
public void contract() {
Log.d(TAG, "签合同");
}
@Override
public void pay() {
Log.d(TAG, "付款");
}
}
主方法:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Customer customer = new Customer();
AgencyProxy agencyProxy = new AgencyProxy(customer);
agencyProxy.seeHouse();
agencyProxy.contract();
agencyProxy.pay();
}
}
输出的内容:
D/Customer: 看房
D/Customer: 签合同
D/Customer: 付款
由此可以看出,我们无需用委托类的对象,直接用代理类的对象去完成所有操作即可。
在Android源码中我们也有类似的地方
ActivityManagerService相当于我们的委托类,ActivityManagerProxy相当于代理类,IActivityManager是联系他们之间的接口。所以想要用ActivityManagerService里的方法,直接用ActivityManagerProxy就可以了,不同的是由于这两个对象存在于两个进程,需要使用Binder跨进程通信,属于远程代理。
ActivityThread通过ActivityManagerProxy与AMS进行通讯:
客户端:ActivityManagerProxy =====>Binder驱动=====> ActivityManagerService:服务器
AMS通过ApplicationThreadProxy与ActivityThread进行通讯:
客户端:ApplicationThread <=====Binder驱动<===== ApplicationThreadProxy:服务器