posts - 68, comments - 19, trackbacks - 0, articles - 1

简单静态代理与动态代理

Posted on 2011-01-29 14:58 viery 阅读(93) 评论(0)  编辑  收藏 所属分类: JavaSE

静态:
首先需要一个接口
public interface Neting {

 public void netting();
 
 public String playGame(String name);
}
然后需要一个实例去继承:

public class NetImpl implements Neting {

 @Override
 public void netting() {
  System.out.println("上网中....");
 }

 @Override
 public String playGame(String name) {
  System.out.println("游戏中....");
  return "game over";
 }

}

最后需要一个同样实现了相同接口的类来做代理,并在每个方法中加入需要的操作:

public class NetingImplProxy implements Neting {

 private Neting neting;
 
 public NetingImplProxy(Neting neting){
  this.neting=neting;
 }
 @Override
 public void netting() {
  this.up();
  neting.netting();
  this.down();
 }

 @Override
 public String playGame(String name) {
  this.up();
  String str=neting.playGame(name);
  this.down();
  return str;
 }
 
 private void up(){
  System.out.println("拨号中");
 }
 
 private void down(){
  System.out.println("断开中");
 }

}

这样产生的结果是每次更改方法中固定的操作时,都需要更改类的源代码,带来很多不便,由此产生动态代理。
动态代理需要一个Proxy类和invocationhandle接口来支持:

同样,上述的接口和实现类都不变,不再需要代理类,而是由下面这个类动态产生:
public class NetHandle implements InvocationHandler {
 
 //首先需要传一个目标对象的引用
 private Object targetObject;
 
//设置构造方法时,直接将目标对象作为参数传入
 public NetHandle(Object targetObject){
  this.targetObject=targetObject;
 }
 
 //这是至关重要的,由此类实例的本方法产生一个$...代理对象:
 public Object createProxyInstance(){
  return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
           targetObject.getClass().getInterfaces(),
           this);
  
 }
//代理对象会自动调用复写后的invoke方法,类似filter中的dofilter;
 @Override
 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
  up(); //在此加入需要增加的操作
  Object ret=method.invoke(targetObject, args);
  down();//在此加入需要增加的操作
  return ret;// 如果没有返回值,则返回null。
 }
 
 private void up(){
  System.out.println("拨号中");
 }
 
 private void down(){
  System.out.println("断开中");
 }
}
测试:
 public static void main(String[] args) {
  
  NetHandle n=new NetHandle(new NetImpl());
  Neting net=(Neting) n.createProxyInstance();
  net.netting();
  System.out.println(net.playGame(""));
 }
运行结果:
拨号中
上网中....
断开中
拨号中
游戏中....
断开中
game over


只有注册用户登录后才能发表评论。


网站导航: