Java笔记之对象代理实例

        ----------------疯狂软件Java培训、iOS培训分享-----------------

  简介即ProxyPattern,23种java常用设计模式之一。代理模式的定义:对其他对象提供一种代理以控制对这个对象的访问,下面我们一起来看看Java对象代理的一些笔记吧。

  代码如下 复制代码

  import java.lang.reflect.InvocationHandler;

  import java.lang.reflect.Method;

  import java.lang.reflect.Proxy;

  //代理需要实现的接口

  interface IVehical {

  //例如我这里写了两个接口

  void run();

  void say();

  }

  //concrete implementation

  class Car implements IVehical{

  //下面这两个方法,作为接口的实现方法,如果接口中没有这些方法,而在这里出现了多余的方法程序将编译不过。

  //每次调用这两个方法都会触发代理对象中的invoke方法。

  public void run() {

  System.out.println("Car is running");

  }

  public void say()

  {

  System.out.println("just one!");

  }

  }

  //proxy class

  //这个类是用来创建代理对象的,这里只是对它进行了简单的封装

  class VehicalProxy {

  private IVehical vehical;

  public VehicalProxy(IVehical vehical) {

  this.vehical = vehical;

  }

  //这个方法返回创建后的对象代理

  public IVehical create(){

  final Class[] interfaces = new Class[]{IVehical.class};

  final VehicalInvacationHandler handler = new VehicalInvacationHandler(vehical);

  return (IVehical) Proxy.newProxyInstance(IVehical.class.getClassLoader(),

  interfaces, (InvocationHandler) handler);

  }

  //这个是跟代理对象绑定的一个处理器,每次调用对象代理中的方法都会触发这个处理器中的invoke方法

  class VehicalInvacationHandler implements InvocationHandler{

  private final IVehical vehical;

  public VehicalInvacationHandler(IVehical vehical) {

  this.vehical = vehical;

  }

  //每当执行对象代理的say或者call(只要是IVehical接口中的方法)就会触发invoke被执行

  public Object invoke(Object proxy, Method method, Object[] args)

  throws Throwable {

  System.out.println("--before running...");

  Object ret = method.invoke(vehical, args);

  System.out.println("--after running...");

  return ret;

  }

  }

  }

  class Main {

  public static void main(String[] args) {

  IVehical car = new Car();

  VehicalProxy proxy = new VehicalProxy(car);

  IVehical proxyObj = proxy.create();

  proxyObj.say();

  }

  }

  /*

  * 程序运行之后将打印如下信息,因此我们可以看出对象的代理可以往特定对象的方法中添加附带的执行代码,

  * 这个的作用在我们需要对一个做日志或者bug调试的时候非常有作用,因为我们不应该把调试代码或者是打

  * 印日志代码写在对象中,这样我们就可以将日志的代码添加到对象的代理中,从而将业务与程序的框架相

  * 关的功能分离,从而保证了代码的“纯净性”。

  * output:

  * --before running...

  * Car is running

  * --after running...

  * */

  疯狂软件学院依托强大的师资力量和就业优势,课程实战强,培养的学员素质高技术过硬。疯狂软件学院成为了国内知名的Java培训平台,向社会输送大量的IT人才,赢得了学员和企业的良好口碑。Java培训,专业Java培训机构,高中以上学历均可参加,疯狂软件学院学员毕业后入职名企,部分学员月薪在7000元以上,平均薪资在5300元至5600元月薪左右,下一位会是你吗?赶快来疯狂软件学院吧!

  疯狂软件Java培训、iOS培训新年钜惠,报名Java就业班免费赠送Java基础班,报名iOS就业班免费赠送iOS基础班,本月火速抢座中,为回报广大新老学员,值此新年之际推出报读就业班赠送基础班的活动。

  -----------------------------------2014年初活动--------------------------------------

  疯狂软件Java学习班方向:

  1.报读JavaEE就业班赠送基础班课程。

  2.开班一次性(一个月内)交清JavaEE就业班学费,赠送基础班全套课程。

  疯狂软件iOS学习班方向:

  1.报读iOS应用+手游就业班赠送iOS基础班课程。

  2.开班一次性(一个月内)交清iOS应用+手游就业班就业班学费,赠送基础班全套课程。

原文地址:https://www.cnblogs.com/gojava/p/3547827.html