代理模式
转:http://blog.csdn.net/caoyinghui1986/archive/2008/05/16/2450221.aspx
学习spring 之前java中的几个模式是很重要的 其中一个就是代理模式。下面用几个简单的例子来理解一下这个模式。以及它的应用。
1,普通的代理模式。
classHouse{
privatefloatprice=200f;
publicfloatgetPrice(){
returnprice;
}
publicvoidsetPrice(){
this.price=price;
}
}
//房东
classHouseOwner{
Househouse=null;
HouseOwner(Househouse){
this.house=house;
}
publicvoidrent(){
System.out.println("房东出租房子价格是:"+house.getPrice());
}
}
//中介商
classHouseProxy{
//20%的中介费
floatcentPricePoint=0.2f;
HouseOwnerown=null;
HouseProxy(HouseOwnerown){
this.own=own;
}
publicvoidrent(){
//调用真实的方法前做一些事
System.out.println("收取中介费"+own.house.getPrice()*centPricePoint);
own.rent();
//调用真实的方法后做一些事
System.out.println("交易成功。");
}
}
//客户
classRentor{
publicstaticvoidmain(String[]args){
Househ=newHouse();
//客户找房东
HouseOwnero=newHouseOwner(h);
o.rent();
System.out.println("*******************");
//客户找代理
HouseProxyhp=newHouseProxy(o);
hp.rent();
}
}
//通过代理我们可以屏蔽掉对象的真实方法的实现。来添加自己相关的业务逻辑。2,动态代理模式。
importjava.lang.reflect.InvocationHandler;
importjava.lang.reflect.*;
importjava.util.*;
classArrayListProxyimplementsInvocationHandler{
Objectlist;
ArrayListProxy(Objectlist){
this.list=list;
}
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)
throwsThrowable{
if(method.getName().equals("add")){
//对特定方法代理
System.out.println("请检查类型.......befor:"+method.getName());
}
//对所有方法代理
//System.out.println("请检查类型.......befor:"+method.getName());
Objecto=method.invoke(list,args);
returno;
}
publicstaticObjectfactory(Objecto){
Classc=o.getClass();
//用真实的对象来构造代理对象
returnProxy.newProxyInstance(c.getClassLoader(),c.getInterfaces(),newArrayListProxy(o));
}
}
classTestDProxy{
publicstaticvoidmain(String[]args){
ArrayListal=newArrayList();
Listpro=(List)ArrayListProxy.factory(al);
pro.add("aaa");
System.out.println(pro.size());
}
}通过代理我们屏蔽了真实对象的实现 。理解这个模式后才能更好的理解 AOP