在 Spring 中,装饰者模式主要应用在 AOP(面向切面编程)的实现中,通过动态代理技术来实现。Spring 中的 AOP 实现使用了代理对象(Proxy)来包装目标对象(Target)。
下面是一个使用装饰者模式的示例代码:
public interface Calculator {
int add(int a, int b);
}
public class CalculatorImpl implements Calculator {
@Override
public int add(int a, int b) {
return a + b;
}
}
public class LoggingHandler implements InvocationHandler {
private Object target;
public LoggingHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Entering method " + method.getName());
Object result = method.invoke(target, args);
System.out.println("Exiting method " + method.getName());
return result;
}
}
public static void main(String[] args) {
Calculator target = new CalculatorImpl();
LoggingHandler handler = new LoggingHandler(target);
Calculator proxy = (Calculator) Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
handler);
int result = proxy.add(2, 3);
System.out.println(result);
}
在上面的代码中,Calculator 是一个计算器接口,CalculatorImpl 是一个实现了 Calculator 接口的实现类,LoggingHandler 是一个实现了 InvocationHandler 接口的类,它用于在调用 Calculator 的 add 方法时输出日志。在 main 方法中,我们先创建了一个 CalculatorImpl 的实例 target,然后创建了一个 LoggingHandler 的实例 handler,再通过调用 Proxy 的 newProxyInstance 方法来创建代理对象 proxy,将 target 对象和 handler 对象传入,从而生成一个代理对象 proxy,最后通过代理对象来调用 Calculator 的 add 方法。在代理对象中,它通过调用 LoggingHandler 的 invoke 方法来在目标对象的 add 方法的前后输出日志。
这里的 LoggingHandler 类就是一个装饰者,通过动态代理技术来将它包装在目标对象的方法调用前后进行增强,从而实现了装饰者模式的应用。