目录
代理模式(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)创建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.newProxylnstance(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;
}
}
4)创建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();
}
}
注:
动态代理模式,是框架中常用的设计模式,比如说:在调用过程中打印日志、过滤器、权限验证等。
使用这个设计模式的目的:一是在调用主程序过程中启动其他程序(面向切面编程),二是为了隐藏逻辑代码,形成一个“黑盒子”。
文章内容输出来源:拉勾教育Java高薪训练营