代理模式是一种结构型设计模式,它允许通过一个代理对象来控制对其他对象的访问。在代理模式中,代理对象与实际对象具有相同的接口,客户端无需知道实际对象的存在,只需要通过代理来访问实际对象。
代理模式通常分为以下两类:
代理模式的应用场景
代理模式常见应用场景包括:
静态代理
下面是一个简单的静态代理的 Java 示例代码:
package cn.leetcode;
public interface Subject {
void request();
}
package cn.leetcode;
public class RealSubject implements Subject {
public void request() {
System.out.println("RealSubject request");
}
}
package cn.leetcode;
public class Proxy implements Subject {
private RealSubject realSubject;
public Proxy(RealSubject realSubject) {
this.realSubject = realSubject;
}
public void request() {
System.out.println("Proxy request");
realSubject.request();
}
}
package cn.leetcode;
public class Client {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
Proxy proxy = new Proxy(realSubject);
proxy.request();
}
}
输出:
Proxy request
RealSubject request
动态代理
代理模式是一种结构型设计模式,它允许通过代理对象来控制对真实对象的访问。代理对象通常充当客户端与真实对象之间的中介,可以在访问真实对象之前或之后执行一些额外的操作,例如缓存、验证、日志记录等。
动态代理是代理模式的一种实现方式,它允许在运行时创建代理对象,而不需要在编译时就确定代理对象的类型。动态代理通常使用 Java 的反射机制来实现,它能够自动生成代理对象的代码,从而简化了代理对象的实现过程。
package cn.leetcode;
public interface Subject {
void brushQuestions();
}
package cn.leetcode;
// 被代理类
public class Person implements Subject {
private String name;
public Person(String name) {
this.name = name;
}
public void brushQuestions() {
System.out.println(name + "正在努力刷题!");
}
}
package cn.leetcode;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DynaProxy implements InvocationHandler {
/**
* 被代理对象
*/
private Object target;
public DynaProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object obj;
before();
// 正在调用业务方法
// 「方法对象」调用,参数 1:目标对象,参数 2:参数列表
obj = method.invoke(target, args);
after();
return obj;
}
private void before() {
System.out.println("准备合适的教程、力扣问题。");
}
private void after() {
System.out.println("合适的总结。");
}
}
package cn.leetcode;
import java.lang.reflect.Proxy;
public class Client {
public static void main(String[] args) {
Person leetcoder = new Person("刷题爱好者");
// Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。
// 动态生成代理对象(类加载器,被代理接口,InvocationHandler)
ClassLoader classLoader = leetcoder.getClass().getClassLoader();
Class<?>[] interfaces = leetcoder.getClass().getInterfaces();
DynaProxy dynaProxy = new DynaProxy(leetcoder);
Subject subject = (Subject) Proxy.newProxyInstance(classLoader, interfaces, dynaProxy);
subject.brushQuestions();
}
}
阅读量:2012
点赞量:0
收藏量:0