首页 > 其他 > 详细

设计模式之代理模式

时间:2020-10-02 22:27:24      阅读:26      评论:0      收藏:0      [点我收藏+]

给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式的英文叫做Proxy, 它是一种对象结构型模式,代理模式分为静态代理和动态代理。

动态代理:

举例:

创建一个Person接口

public interface Person {
    void doSomething();
}

创建一个实现类

public class Bob implements Person {
  public void doSomething() {
    System.out.println("Bob doing something!");
  }
}

创建JDK动态代理类,使其实现InvocationHandler接口。拥有一个名为target的变量,并创建getTarget获取代理对象方法。

/**
* JDK动态代理
* 需要实现InvocationHandler接口
*/
public class JDKDynamicProxy implements InvocationHandler {
  //被代理的对象
  Person target;
  // JDKDynamicProxy构造函数
  public JDKDynamicProxy(Person person) {
    this.target = person;
  }
  // 获取代理对象
  public Person getTarget() {
    return (Person)下·Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
  }

  // 动态代理invoke方法
  public Person invoke(Object proxy, Method method, Object[] args) throws Throwable {
    // 被代理方法前执行
    System.out.println("JDKDynamicProxy do something before!");
    // 执行被代理的方法
    Person result = (Person) method.invoke(target, args);
    // 被代理方法后执行
    System.out.println("JDKDynamicProxy do something after!");
    return result;
  }
}

JDK动态代理测试类

public class JDKDynamicTest {
  public static void main(String[] args) {
    System.out.println("不使用代理类, 调用doSomething方法");
    Person person = new Bob();
    person.doSomething();
    System.out.println("-------------------------------------- 分割线 --------------------------------------");
    System.out.println("使用动态代理类, 调用doSomething方法");
    //获取代理类
    Person proxyPerson = new JDKDynamicProxy(new Bob()).getTarget();
    // 调用doSomething方法
    proxyPerson.doSomething();
  }
}

  

设计模式之代理模式

原文:https://www.cnblogs.com/brook0366/p/13762805.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!