java 设计模式之代理

// 定义接口
interface MyService {
    void methodA();
    void methodB();
    void methodC();
    void methodD();
    void methodE();
}
class MyServiceImpl implements MyService {
    @Override
    public void methodA() {
        System.out.println("执行方法A");
    }
    
    @Override
    public void methodB() {
        System.out.println("执行方法B");
    }
    
    @Override
    public void methodC() {
        System.out.println("执行方法C");
    }
    
    @Override
    public void methodD() {
        System.out.println("执行方法D");
    }
    
    @Override
    public void methodE() {
        System.out.println("执行方法E");
    }
}
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 {
        // 只对方法B和方法E进行增强
        if ("methodB".equals(method.getName())) {
            System.out.println("=== 方法B增强开始 ===");
            Object result = method.invoke(target, args);
            System.out.println("=== 方法B增强结束 ===");
            return result;
        } else if ("methodE".equals(method.getName())) {
            System.out.println("=== 方法E增强开始 ===");
            Object result = method.invoke(target, args);
            System.out.println("=== 方法E增强结束 ===");
            return result;
        } else {
            // 其他方法不增强,直接执行
            return method.invoke(target, args);
        }
    }
}
public class ProxyExample {
    public static void main(String[] args) {
        // 创建目标对象
        MyService target = new MyServiceImpl();
        
        // 创建代理对象
        MyService proxy = (MyService) Proxy.newProxyInstance(
            target.getClass().getClassLoader(),
            target.getClass().getInterfaces(),
            new MyInvocationHandler(target)
        );
        
        // 测试所有方法
        System.out.println("调用方法A:");
        proxy.methodA();
        
        System.out.println("\n调用方法B:");
        proxy.methodB();
        
        System.out.println("\n调用方法C:");
        proxy.methodC();
        
        System.out.println("\n调用方法D:");
        proxy.methodD();
        
        System.out.println("\n调用方法E:");
        proxy.methodE();
    }
}
posted @ 2026-03-12 19:35  dvdhellohaha  阅读(15)  评论(0)    收藏  举报