用java举例说明两种代理模式
时间: 2024-02-24 22:00:07 浏览: 24
好的,以下是两种代理模式的Java示例:
1. 静态代理模式
静态代理模式是通过手动编写一个代理类来实现的,该代理类与原始类实现相同的接口,且在调用原始类方法前后加上自己的处理逻辑。下面是一个简单的示例:
```java
// 接口
public interface Subject {
void request();
}
// 原始类
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject request.");
}
}
// 代理类
public class Proxy implements Subject {
private final Subject realSubject;
public Proxy(Subject realSubject) {
this.realSubject = realSubject;
}
@Override
public void request() {
System.out.println("Before request.");
realSubject.request();
System.out.println("After request.");
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Subject realSubject = new RealSubject();
Subject proxy = new Proxy(realSubject);
proxy.request();
}
}
```
2. 动态代理模式
动态代理模式是在运行时动态创建代理对象,无需手动编写代理类。Java提供了一个 `java.lang.reflect.Proxy` 类和一个 `java.lang.reflect.InvocationHandler` 接口,我们可以使用它们来实现动态代理。下面是一个简单的示例:
```java
// 接口
public interface Subject {
void request();
}
// 原始类
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject request.");
}
}
// InvocationHandler实现类
public class MyInvocationHandler implements InvocationHandler {
private final Object target;
public MyInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before " + method.getName() + " method.");
Object result = method.invoke(target, args);
System.out.println("After " + method.getName() + " method.");
return result;
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Subject realSubject = new RealSubject();
InvocationHandler handler = new MyInvocationHandler(realSubject);
Subject proxy = (Subject) Proxy.newProxyInstance(
realSubject.getClass().getClassLoader(),
realSubject.getClass().getInterfaces(),
handler);
proxy.request();
}
}
```
以上就是两种代理模式的Java示例。静态代理模式需要手动编写代理类,但是比较简单;动态代理模式无需手动编写代理类,但是使用起来稍微复杂一些。