本文目录导读:
代理模式是一种设计模式,它为其他对象提供一种代理以控制对这个对象的访问,这种模式的主要目的是在访问对象时,可以在不改变原始对象的基础上增加一些额外的功能,代理模式有很多种实现方式,如静态代理、动态代理等,本文将详细介绍代理模式的概念、特点以及在实际项目中的应用。
代理模式的概念
代理模式是一种结构型设计模式,它通过创建一个代理对象来控制对原对象的访问,代理对象可以执行一些额外的操作,例如记录日志、权限控制等,当客户端需要访问原对象时,客户端首先与代理对象进行通信,然后代理对象再将请求转发给原对象,这样,我们可以在不修改原对象的情况下,为其添加一些额外的功能。
代理模式的特点
1、封装性:代理模式将原对象和代理对象进行了封装,客户端只能通过代理对象来访问原对象,从而保护了原对象的内部状态。
2、灵活性:代理模式可以根据需要创建不同的代理对象,以实现不同的功能。
3、解耦:代理模式将原对象和代理对象进行了解耦,使得两者之间的依赖关系降低,有利于系统的扩展和维护。
代理模式的实现
1、静态代理
静态代理是指在编译时就确定了代理类和被代理类的关系,在Java中,可以使用java.lang.reflect.Proxy
类来实现静态代理,以下是一个简单的静态代理示例:
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; interface Subject { void doSomething(); } class RealSubject implements Subject { @Override public void doSomething() { System.out.println("RealSubject do something"); } } class ProxySubject implements InvocationHandler { private Object target; public ProxySubject(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Before do something"); Object result = method.invoke(target, args); System.out.println("After do something"); return result; } } public class Main { public static void main(String[] args) { Subject realSubject = new RealSubject(); Subject proxySubject = (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), new ProxySubject(realSubject)); proxySubject.doSomething(); } }
2、动态代理
动态代理是指在运行时动态生成代理类,在Java中,可以使用java.lang.reflect.Proxy
类和java.lang.reflect.InvocationHandler
接口来实现动态代理,以下是一个简单的动态代理示例:
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.stream.Collectors; import java.util.stream.Stream; import java.util.function.Function; interface Subject { void doSomething(); } class RealSubject implements Subject { @Override public void doSomething() { System.out.println("RealSubject do something"); } } class DynamicProxy implements InvocationHandler { private Object target; public DynamicProxy(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Before do something"); Object result = method.invoke(target, args); System.out.println("After do something"); return result; } } public class Main { public static void main(String[] args) throws Exception { Subject realSubject = new RealSubject(); Function<Method, Method> handler = method -> method; // 这里可以根据需要自定义handler逻辑,例如添加日志记录等操作,在本例中,我们直接使用原始方法。