感谢博主:http://blog.csdn.net/hp910315/article/details/51199748
在安卓开发中我基本上没有自己写过代理,大概只有架构师才能用到吧. 这是一篇学习理解的博客,在学习一个新事物之前要问两个为什么?
1.什么是代理
2.代理能帮我们做什么
代理在现实生活中,应该类似于中介机构吧,代理是可以为客户提供一系列的服务的机构.
这里有这样一个需求:小明十个踏实勤奋的孩子,平时工作比较忙,每次申请出差后,都没时间买车票和报销车费(这里是假设),这时候有一家中介机构叫德仁(最近猎场比较火),专门为客户提供各种服务,包括跑腿买票报销.
下面我们用代码实现这个业务场景:
1.创建小明公司Company接口(为什么要创建这个接口,因为小明公司有很多人,都要实现这个接口,便于管理)
/**
* 小明的公司
* @author Administrator
*/
public interface Company {
/**
* 申请出差
*/
public void application();
/**
* 审批通过
*/
public void approval();
}
2.创建小明(有点意思)XiaoMIng类并实现Company接口
public class XiaoMing implements Company{
@Override
public void application() {
System.out.println("小明申请出差");
}
@Override
public void approval() {
System.out.println("小明申请出差获得批准");
request();
}
/**
* 小明的需求需要有人买车票,然后报销
*/
public void request() {
System.out.println("小明需要有人给买车票和报销车费");
}
3.创建一家德仁的公司 DeRenAgency类并且实现InvocationHandler接口(java api自带的接口)
在invoke接口中判断只有客户出差获得批准后才为客户提供买票服务
//Invocation 调用
public class DeRenAgency implements InvocationHandler{
private Object customer;
public DeRenAgency (){};
public DeRenAgency (Object customer){
this.customer = customer;
};
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//只有审批通过后才进行服务
if(method.getName().equals("approval")) {
Object obj = method.invoke(customer, args);
//一家叫德仁的代理机构了解客户的需求后
System.out.println("代理:为客户买车票以及报销费用");
System.out.println("***************************");
return obj;
}
return null;
}
4.调用这里使用到了Proxy(java api自带的类)通过newProxyInstance 和DeRenAgency 方法获取小明对象(这里是类的向上转型),调用小明的审批通过方法打印日志:
小明申请出差获得批准
小明需要有人给买车票和报销车费
代理:为客户买车票以及报销费用
***************************
public class Mian {
public static void main(String [] args) {
DeRenAgency deRenAgency = new DeRenAgency(new XiaoMing());
Company reimbursement = (Company) Proxy.newProxyInstance(Company.class.getClassLoader(),
new Class[]{Company.class}, deRenAgency);
reimbursement.application();//申请
reimbursement.approval();//审批通过
}
}
至此动态代理阶段实现