Spring框架中设计模式之 装饰者模式

在 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 类就是一个装饰者,通过动态代理技术来将它包装在目标对象的方法调用前后进行增强,从而实现了装饰者模式的应用。