当前位置:首页 > 全部子站 > IT > 思科认证

JAVA进阶--深日了解Java中的代理模式

来源:长理培训发布时间:2017-12-21 14:16:46

 百度广告

  代理,想必大家都应该知道是什么冬冬了,一般的手机产商都有代理商,歌星们都有自己的经纪人,如此这些都可以看作是一种代理模式。下面我选择如下的一种情景来进行讲述:某董事长出差,但是此时公司有个聚会,董事长买单,但是由他的秘书去结帐。我们就权且把这个看作一个代理行为。

  首先我们定义一个接口:商人(Merchant),如下所示

  package cn.edu.hust.cm.test;

  public interface Merchant {

   void treat();//商人都要请客吃饭滴,^_^

  }

  然后我们定义一个类:董事长(Director),如下所示

  package cn.edu.hust.cm.test;

  public class Director implements Merchant {

   public Director() {

   }

   public void treat() {

   System.out.println("董事长请大家吃饭");

   }

  }

  OK,我们现在要给他找代理了,这个代理就是他的秘书(Secretary)。这里要涉及到一些代理的机制了。在Java中,用来做代理的类一般都要实现InvocationHandler,实现它的invoke方法,至于为啥是这样俺也不知道了,^_^。另外,当我们产生一个代理实例(proxy instance)的时候,只要我们通过这个实例调用任何方法,都会导致invoke方法的调用,还是看例子吧,如下所示

  package cn.edu.hust.cm.test;

  import java.lang.reflect.InvocationHandler;

  import java.lang.reflect.Method;

  public class Secretary implements InvocationHandler {

   public Secretary(Director director) {

   this.director=director;

   }

   public Object invoke(Object arg0, Method arg1, Object arg2)

   throws Throwable {

   director.treat();

   System.out.println("由秘书结帐咯!");

   return null;

   }

   private Director director;

  }

|||   现在我们开始构建我们的主体测试代码,如下面的代码所示

  package cn.edu.hust.cm.test;

  import java.lang.reflect.InvocationHandler;

  import java.lang.reflect.Proxy;

  public class ProxyTest extends Proxy {

   public ProxyTest(InvocationHandler arg0) {

   super(arg0);

   }

   public static void main(String args) {

   Director director=new Director();

   InvocationHandler secretary=new Secretary(director);

   Merchant merchant=(Merchant)Proxy.newProxyInstance(director.getClass().getClassLoader(),director.getClass().getInterfaces(),secretary);

   merchant.treat();

   }

  }

  运行程序,输出将为:董事长请客

  由秘书结帐咯!

  这里有几个要说明的地方,如下所述

  1.Proxy.newProxyInstance方法的作用,它的作用为某个对象创建一个代理对象,本例中是为director创建了一个代理对象,这个对象属于哪个类呢?我们在程序里面加这样一句System.out.println(merchant.getClass().getName()),输出是$Proxy0,呵呵,说明已经产生了一个代理类了,这个类实现了director所属类中的所有接口。

  2.代理的实现机制问题。个人觉得这个似乎就是一个事件处理的机制,当代理对象调用某个方法的时候,就会触发相应的invoke方法。因此Proxy.newProxyInstance方法的第三个参数就相当于给这个代理对象注册了一个监听器。

  Proxy类还有几个方法,用法可以查看相应的API文档。

责编:罗莉

发表评论(共0条评论)
请自觉遵守互联网相关政策法规,评论内容只代表网友观点,发表审核后显示!

国家电网校园招聘考试直播课程通关班

  • 讲师:刘萍萍 / 谢楠
  • 课时:160h
  • 价格 4580

特色双名师解密新课程高频考点,送国家电网教材讲义,助力一次通关

配套通关班送国网在线题库一套

课程专业名称
讲师
课时
查看课程

国家电网招聘考试录播视频课程

  • 讲师:崔莹莹 / 刘萍萍
  • 课时:180h
  • 价格 3580

特色解密新课程高频考点,免费学习,助力一次通关

配套全套国网视频课程免费学习

课程专业名称
讲师
课时
查看课程
在线题库
面授课程更多>>
图书商城更多>>
在线报名
  • 报考专业:
    *(必填)
  • 姓名:
    *(必填)
  • 手机号码:
    *(必填)
返回顶部