设计模式核心 - 灵活地应用多态。
//创建接口
interface Eatable{
void eat();
}
//创建实现接口的类
class Apple implements Eatable{
@Override
public void eat() {
System.out.println("Directly eat.");
}
}
/**
* 1. 如何根据加载到内存的被代理类,动态地创建一个代理类及其对象?
* 2. 当代理类的对象调用方法时,如何动态的去调用被代理类中的同名方法?
*/
//创建代理工厂类,该工厂可动态地创建任何代理类,进而创建代理类的对象
class ProxyFactory{
public static Object getProxyInstance(Object object) {
ActualInvocationHandler actualInvocationHandler = new ActualInvocationHandler();
actualInvocationHandler.bind(object);
return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), actualInvocationHandler);
}
}
//创建实现InvocationHandler去调用被代理类的方法。
class ActualInvocationHandler implements InvocationHandler{
private Object object;
public void bind(Object object) {
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object returValue = method.invoke(this.object, args);
return returValue;
}
}
//测试类
public class DynamicProxyTest {
public static void main(String [] args) {
Apple apple = new Apple();
Eatable proxyInstance = (Eatable) ProxyFactory.getProxyInstance(apple);
proxyInstance.eat();
//该代码承接上一篇静态代理相关类的使用
ClothFactory clothFactory = (ClothFactory) ProxyFactory.getProxyInstance(new NikeFactory());
clothFactory.produceCloth();
}
}
从代码编写过程和比较静态代理,我们可以知道动态代理可以增加代码的复用性;通过使用代理工厂类的使用,不用重复设计代理类。