代理模式( Proxy Pattern):给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式的英文叫做 Proxy,它是一种对象结构型模式,代理模式分为静态代理和动态代理,我们来介绍动态代
举例
(1)创建一个抽象类, Person接口,使其拥有一个没有返回值的 doSomething方法。
/** * 抽象类人 */
public interface Person {
void doSomething();
}
(2)创建一个名为Bob的 Person接口的实现类,使其实现 dosomething方法
/** *创建一个名为Bob的人的实现类 */
public class Bob implements Person {
public void doSomething() {
System.out.println("Bob doing something!");
}
}
(3)创建DK动态代理类,使其实现 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动态代理测试类 JDKDynamicTest
/**
* JDK动态代理测试
*/
public class JDKDynamicTest {
public static void main(String[] args) {
System.out.println("不是用代理了类,调用doSomething方法");
// 不是用代理类
Person person = new Bob();
// 调用doSomething方法
person.doSomething();
System.out.println("-------------------------------------- 分割线-------------------------------------");
System.out.println("使用代理类,调用doSomething方法");
// 获取代理类
Person proxyPerson = new JDKDynamicProxy(new Bob()).getTarget();
// 调用doSomething方法
proxyPerson.doSomething();
}
}