代理设计模式分为两种,一种为动态代理,另外一种为静态代理。其中动态代理应用的比较广泛,如spring的AOP(面向切面编程)等等。。。下面简单的来介绍下这种模式的区别:
1. 静态代理:
在代理类中手动提供所有需要被代理的对象
优点: -->可以在执行功能前后添加额外功能,增加了程序的可扩展性
-->无法直接获取到所代理类,增加了被代理类的安全性
缺点: -->运行效率上降低
-->无法直接获取到被代理的类,增加了复杂性
public class FangDong {
public void chuzufang(){
System.out.println("我要出租一个一室一厅的房子");
}
}
动态代理:由Proxy动态代理所需要代理的对象,由运行时指定。
提供InvocationHandler接口的实现类(调用接口,执行每个被代理对象的方法时,执行InvocationHandler中invoke方法)
public class ZhongJie implements InvocationHandler{
//被代理对象
private Object obj;
public ZhongJie(Object obj){
this.obj = obj;
}
/**
* proxy:代理对象,新产生的代理对象
* method:所代理的方法
* args:代理方法的参数
*
* 返回值:Object,返回原方法的返回内容。
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("收取房东中介费");
Object result= method.invoke(obj, args);
System.out.println("收取个人中介费");
return result;
}
}
要求被代理对象,必须提供对应接口
public interface FangDongDao {
void chuzufang();
}
public class FangDong implements FangDongDao{
public void chuzufang(){
System.out.println("我要出租一个一室一厅的房子");
}
}
加载对应的内容
ClassLoader:类加载器,负责加载类,然后才能实例化
Class:类类型
public class Mine {
public static void main(String[] args) {
//1.Invocationhandler对象
InvocationHandler handler = new ZhongJie(new FangDong());
//2.产生被代理对象
FangDongDao fangdong = (FangDongDao) Proxy.newProxyInstance(FangDongDao.class.getClassLoader(), new Class[]{FangDongDao.class}, handler);
fangdong.chuzufang();
}
}