java代碼實現設計模式之代理模式

/* 代理模式
*
* 生活中:
* (1)本身不方便作一些事情,例如:去國外 找代購 租房 買房 等等...
* 一、代理模式
* (1)主題接口:要求代理類與被代理類實現同一個接口,例如:DAO接口
* (2)被代理者
* (3)代理者
* 必須持有被代理者的引用
*
* 二、靜態代理模式
* 缺點:一個代理類只能替一個代理主題(接口)代理工做
*
* 三、動態代理模式
* 優勢:一個代理工做處理器,能夠替多個代理主題代理工做,只有代理工做內容同樣就能夠。
* 須要:
* (1)編寫一個代理工做處理器的類,這個類必須實現一個接口InvocationHandler
* (2)用JDK中提供了一個Proxy類,來建立代理類的對象
* (3)調用方法ide

示例: 靜態代理this

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方法執行結束");
  }
}get

靜態代理的使用:new StaticProxy(new B()).run()io

 

示例:動態代理class

interface C {
  void run();
}object

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();

  }

}

相關文章
相關標籤/搜索