在代理模式中,我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。
\---demo
DynamicProxyDemo.java
OneService.java
Service.java
StaticProxyDemo.java
TwoService.java
Service.java
接口,提供perform()方法。
OneService.java
实现类,实现perform()方法。
TwoService.java
实现类,实现perform()方法。
StaticProxyDemo.java(静态代理)
静态代理,里面有一个ServiceProxy类,在该类中也重写了perform()方法。在perform()方法中,调用了真实对象的perform()方法,同时新增了一些操作。
但是静态代理有个缺点:一个真实对象要对应一个静态代理对象,代码编写十分繁琐。
DynamicProxyDemo.java(动态代理)
动态代理,创建实现InvocationHandler接口的类,再通过Proxy.newProxyInstance方法创建代理对象,之后便可以通过代理对象调用perform方法。
区别
静态代理需要为每个接口创建代理类,并为每个方法编写代理逻辑,这会导致大量的重复代码。在实际开发中,当涉及到多个类和方法需要类似的代理逻辑时,通过动态代理来实现通常是更好的选择。动态代理通过创建调用处理器(InvocationHandler)、创建代理实例(Proxy.newProxyInstance),然后便可以直接调用代理方法。