Design pattern (动态代理)

设计模式核心 - 灵活地应用多态。

//创建接口
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();
	}
}

从代码编写过程和比较静态代理,我们可以知道动态代理可以增加代码的复用性;通过使用代理工厂类的使用,不用重复设计代理类。

发布了70 篇原创文章 · 获赞 4 · 访问量 3047

猜你喜欢

转载自blog.csdn.net/qq_34515959/article/details/104936177