码迷,mamicode.com
首页 > 编程语言 > 详细

java代码实现设计模式之代理模式

时间:2020-04-06 17:29:08      阅读:75      评论:0      收藏:0      [点我收藏+]

标签:接口   cat   类对象   run方法   列表   new   时间   jdk   动态代理模式   

/* 代理模式
*
* 生活中:
* (1)自己不方便做一些事情,例如:去国外 找代购 租房 买房 等等...
* 1、代理模式
* (1)主题接口:要求代理类与被代理类实现同一个接口,例如:DAO接口
* (2)被代理者
* (3)代理者
* 必须持有被代理者的引用
*
* 2、静态代理模式
* 缺点:一个代理类只能替一个代理主题(接口)代理工作
*
* 3、动态代理模式
* 优点:一个代理工作处理器,可以替多个代理主题代理工作,只有代理工作内容一样就可以。
* 需要:
* (1)编写一个代理工作处理器的类,这个类必须实现一个接口InvocationHandler
* (2)用JDK中提供了一个Proxy类,来创建代理类的对象
* (3)调用方法

示例: 静态代理

interface A{
  void run();
}

class B implements A{
  @Override
  public void run() {
    for (int i = 0; i < 1000; i++) {
      System.out.println(i);
    }
  }
}

class StaticProxy implements A{
  private A a;
  public StaticProxy(A a) {
    this.a = a;
  }

  @Override
  public void run() {
    System.out.println("run方法执行");
    long start = System.currentTimeMillis();
    a.run();
    long end = System.currentTimeMillis();
    System.out.println("执行时间:" + (end - start));
    System.out.println("run方法执行结束");
  }
}

静态代理的使用:new StaticProxy(new B()).run()

 

示例:动态代理

interface C {
  void run();
}

class CImpl implements C{
  @Override
  public void run() {
    System.out.println("C接口的run方法执行中");
  }
}

class DynamicProxy implements InvocationHandler {

  //被代理的对象
  private Object obj;
  public DynamicProxy(Object obj){
    this.obj = obj;
  }

  

  /*
  * 参数一:代理类的对象
  * 参数二:被代理者要执行的方法
  * 参数三:被代理者要执行的方法需要的实参列表
  * 这个方法不是程序调用的,是一会执行代理类对象的方法时自动调用
  */

  @Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    System.out.println(method.getName() + "方法执行");
    long start = System.currentTimeMillis();
    Object object = method.invoke(obj, args);
    long end = System.currentTimeMillis();
    System.out.println("执行时间:" + (end - start));
    System.out.println(method.getName() + "方法执行结束");
    return object ;
  }
}

动态代理使用:

public class TestProxy2 {
  public static void main(String[] args) {
    Class clazz = CImpl.class;
    ClassLoader loader = clazz.getClassLoader();
    Class[] interfaces = clazz.getInterfaces();
    C proxy = (C) Proxy.newProxyInstance(loader, interfaces, new DynamicProxy(clazz));
    proxy.run();

  }

}

java代码实现设计模式之代理模式

标签:接口   cat   类对象   run方法   列表   new   时间   jdk   动态代理模式   

原文地址:https://www.cnblogs.com/dirsoen/p/12642747.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!