代理模式是一种设计模式,它允许通过创建一个代理对象来控制对另一个对象的访问。以下是使用代理模式编程的一般步骤和示例:
1. 定义接口
首先,定义一个接口,该接口声明了代理对象和真实对象都需要实现的方法。
```java
public interface Subject {
void request();
}
```
2. 创建真实对象
创建一个真实对象,该对象实现了接口中声明的方法。
```java
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject: Handling request.");
}
}
```
3. 创建代理对象
创建一个代理对象,该对象也实现了接口中声明的方法,并持有一个真实对象的引用。
```java
public class ProxySubject implements Subject {
private RealSubject realSubject;
public ProxySubject() {
realSubject = new RealSubject();
}
@Override
public void request() {
System.out.println("ProxySubject: Preparing for request.");
realSubject.request();
}
}
```
4. 使用代理对象
在客户端代码中,使用代理对象来调用真实对象的方法。
```java
public class Client {
public static void main(String[] args) {
Subject proxy = new ProxySubject();
proxy.request();
}
}
```
5. 运行结果
运行客户端代码,输出将会是:
```
ProxySubject: Preparing for request.
RealSubject: Handling request.
```
代理模式的类型
代理模式可以根据其行为方式分为几种不同的类型:
静态代理:由程序员创建或由工具生成代理类的源码,再对其编译。代理类和真实类都实现了相同的接口。
动态代理:在运行时创建的代理对象,通常借助于反射机制。动态代理不需要代理类和真实类实现相同的接口。
Cglib代理:通过Cglib库动态生成代理类,不需要实现接口。
示例:动态代理
在Java中,可以使用`java.lang.reflect.Proxy`类来实现动态代理。
```java
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DynamicProxyExample {
public interface Service {
void request();
}
public static void main(String[] args) {
Service realService = new RealService();
Service proxyService = (Service) createProxy(realService, Service.class);
proxyService.request();
}
public static Object createProxy(Object target, Class<?> iface) {
InvocationHandler handler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before method call");
Object result = method.invoke(target, args);
System.out.println("After method call");
return result;
}
};
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
new Class<?>[]{iface},
handler
);
}
}
```
运行结果
运行动态代理示例,输出将会是:
```
Before method call
RealSubject: Handling request.
After method call
```
通过以上步骤和示例,你可以理解和使用代理模式进行编程。代理模式在需要控制对象访问、添加额外逻辑(如权限控制、缓存、延迟加载)等场景中非常有用。