代理模式是Java中常见的设计模式之一,它允许在不直接修改原始对象的情况下,通过代理对象对原始对象进行功能扩展。这种模式在软件开发中有着广泛的应用,特别是在需要在不改变现有代码结构的前提下增加新功能时...
代理模式是Java中常见的设计模式之一,它允许在不直接修改原始对象的情况下,通过代理对象对原始对象进行功能扩展。这种模式在软件开发中有着广泛的应用,特别是在需要在不改变现有代码结构的前提下增加新功能时。
代理模式的核心思想是将对目标的访问转移到代理对象上。通过这种方式,可以在不改变原始对象代码的情况下,对原始对象进行功能扩展。代理模式通常包含以下三个角色:
代理模式有两种实现方式:静态代理和动态代理。
静态代理在编译时就确定了被代理的类,因此可以直接使用静态代理。以下是一个静态代理的例子:
// 定义接口
public interface Subject { void visit();
}
// 实现接口的目标对象
public class RealSubject implements Subject { private String name = "yk"; @Override public void visit() { System.out.println(name); }
}
// 实现接口的代理对象
public class ProxySubject implements Subject { private Subject subject; public ProxySubject(Subject subject) { this.subject = subject; } @Override public void visit() { System.out.println("Before visiting..."); subject.visit(); System.out.println("After visiting..."); }
}
// 测试类
public class Test { public static void main(String[] args) { Subject realSubject = new RealSubject(); Subject proxySubject = new ProxySubject(realSubject); proxySubject.visit(); }
}动态代理在运行时动态创建代理对象,通过JDK的Proxy类和反射机制实现。以下是一个动态代理的例子:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// 实现InvocationHandler接口的处理器
class ProxyHandler implements InvocationHandler { private Object target; public ProxyHandler(Object 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 class Test { public static void main(String[] args) { RealSubject realSubject = new RealSubject(); InvocationHandler handler = new ProxyHandler(realSubject); Subject proxySubject = (Subject) Proxy.newProxyInstance( realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), handler ); proxySubject.visit(); }
}代理模式在以下场景中非常有用:
代理模式是一种强大的设计模式,可以在不修改原始对象代码的情况下,对原始对象进行功能扩展。通过静态代理和动态代理两种实现方式,代理模式在软件开发中有着广泛的应用。掌握代理模式,可以帮助我们更好地进行软件开发,提高代码的可复用性和可维护性。