代理模式

转: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,动态代理模式。

代理模式//假设做一个ArrayList 的 添加提示的功能。 就是 在调用它的add方法的时候 输出一句 请检查类型.

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

相关推荐