代码改变世界

java代理模式

2012-03-01 16:11  党飞  阅读(220)  评论(0)    收藏  举报

---------------------- android培训java培训、期待与您交流! ----------------------

java代理模式有两种实现:静态代理和动态代理。
代理模式涉及三个概念:委托(者)、代理(者)和主题接口。

代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

 

 

 

代理模式一般涉及到的角色有:
抽象角色:声明真实对象和代理对象的共同接口;
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时  刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。

 
一、静态代理
静态代理要求:代理类和被代理类都必须实现同一个接口,在代理类中实现事务操作等横切业务逻辑,被代理类中只保留核心业务逻辑。
缺点:当方法很多时,势必要为每个方法都要进行代理操作,导致增加了代码的复杂度,所以静态代理不能胜任方法较多的情况。
1.先定义一个接口类

package com.zlc.proxy;

//接口类
public interface HelloWorld{
 public void print();
}

2.定义一个该接口的实现类 

package com.zlc.proxy;
//接口的实现类
public class HelloWorld Implimplements HelloWorld{

 @Override
 public void print(){
  System.out.println("hello world");
 }

}

 
3.定义一个静态代理类

package com.zlc.proxy;

//静态代理类
public class StaticProxy implements HelloWorld{
 public HelloWorld helloworld;
 
 public StaticProxy(HelloWorld helloworld){
  super();
  this.helloworld = helloworld;
 }

 @Override
 public void print(){
  System.out.println("Welcome");
  //相当于回调
  helloworld.print();
 }

}

 
4.一个测试类

package com.zlc.proxy;

public classTestStaticProxy{
 public static void main(String[] args){
  HelloWorld helloworld =newHelloWorldImpl();
  StaticProxy staticProxy =newStaticProxy(helloworld);
  staticProxy.print();
 }

}


二、动态代理 
在java中要实现动态代理机制,则需要java.lang.reflect.InvocationHandler接口和java.lang.reflect.Proxy类的支持。
1.定义一接口

package com.zlc.proxy;

import java.lang.reflect.Method;

public interface InvocationHandler{
 public  Object invoke(Object proxy,Method method,Object[] args)throwsThrowable;  
}
/*invoke()方法中的参数:  
proxy - 在其上调用方法的代理实例  
method - 对应于在代理实例上调用的接口方法的 Method 实例。
Method 对象的声明类将是在其中声明方法的接口,该接口可以是代理类赖以继承方法的代理接口的超接口。  
args - 包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为 null。
基本类型的参数被包装在适当基本包装器类(如 java.lang.Integer 或 java.lang.Boolean)的实例中。*/


Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类。
 
2.DynamicProxyDemo.java

package com.zlc.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.lang.reflect.Method;

interface Subject{
 public String say(String name,int age)// 定义抽象方法say
}
class RealSubject implements Subject// 实现接口
 publicString say(String name,int age){
  return"姓名:"+ name +",年龄:"+ age ;
 }
}

class MyInvocationHandler implements InvocationHandler{
 privateObject obj ;
 public Object bind(Object obj){
  this.obj = obj // 真实主题类
  returnProxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
 }
 public Object invoke(Object proxy,Method method,Object[] args)throwsThrowable{
  Object temp = method.invoke(this.obj,args)// 调用方法
  return temp ;
 }
}

public class DynamicProxyDemo{
 public static void main(String args[]){
  Subjectsub=(Subject)newMyInvocationHandler().bind(newRealSubject());
  String info =sub.say("阿成",21);
  System.out.println(info);
 }
}

---------------------- android培训java培训、期待与您交流! ----------------------