代理模式

代理模式在代码也会经常要用到,形象的比喻下代理模式,就像你要买房,由于你不熟悉当地的房产,所以需要找房产中介帮你忙,在这里你就相当于是委托对象,房产中介相当于代理类帮你去做你想要做的事。

使用场景:当无法或者不想直接访问某个对象时可以通过一个代理对象来间接访问。

我们看下代码方面是如何实现的,首先我们需要定义一个接口,这个接口由委托类和代理类一起实现;

接口:

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:服务器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值