利用静态代理模式和动态代理模式设计简单的计算器
时间: 2024-10-13 13:12:32 浏览: 23
Java设计模式:静态代理、装饰者、动态代理详解
静态代理模式和动态代理模式都是常用的软件设计模式,它们主要用于创建对象的实例并控制其行为。在这两个例子中,我们将设计一个基础的简单计算器,分别通过静态代理和动态代理的方式实现。
**1. 静态代理模式**
在这个模式下,我们首先创建一个`Calculator`接口,然后定义一个具体的`AddCalculator`作为静态代理类:
```java
// Calculator 接口
public interface Calculator {
int add(int a, int b);
}
// 具体实现 - AddCalculator (静态代理)
public class AddCalculator implements Calculator {
private final Calculator delegate;
public AddCalculator() {
delegate = new BasicCalculator(); // 实现基础加法计算
}
@Override
public int add(int a, int b) {
return delegate.add(a, b); // 调用实际的加法操作
}
}
```
`BasicCalculator`是一个基础的计算器实现,负责做加法运算。
**2. 动态代理模式(Java语言通常使用CGLIB或JDK动态代理)**
首先创建接口 `Calculator` 和基本实现 `BasicCalculator`,然后利用动态代理创建 `ProxyCalculator` 类:
```java
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// 动态代理的InvocationHandler实现
public class CalculatorProxyHandler implements InvocationHandler {
private final Calculator target;
public CalculatorProxyCalculator(Calculator target) {
this.target = target;
}
@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;
}
}
// 使用动态代理创建
public static Calculator createDynamicCalculator(Calculator target) {
return (Calculator) Proxy.newProxyInstance(
Calculator.class.getClassLoader(),
new Class<?>[]{Calculator.class},
new CalculatorProxyHandler(target));
}
```
现在你可以用这两种方式创建计算器,例如:
```java
Calculator staticProxy = new AddCalculator();
Calculator dynamicProxy = createDynamicCalculator(new BasicCalculator());
int result1 = staticProxy.add(1, 2);
int result2 = ((Calculator) dynamicProxy).add(3, 4);
System.out.println("Result1: " + result1);
System.out.println("Result2: "
阅读全文