您的位置:首页 > 其它

设计模式之五:代理模式(Proxy Pattern)

2013-04-19 16:57 351 查看
(GOF)书上 代理模式:给某一对象提供代理对象,并由代理对象控制具体对象的引用.  代理模式
是对象结构型模式。

public class MethodProxy {

    private Class clazz;    //对象所属的类     

    private Object target;  //目标对象     

    private Method method;  //目标方法     

    private Object[] params;    //参数数组         

    @SuppressWarnings("unchecked")     

    public MethodProxy(Object target, String methodName, Object ... params) {     

         rebindTarget(target, methodName, params);   //设置目标对象与方法     

    }     

    //  重新设置目标对象与方法    

    public void rebindTarget(Object target, String methodName, Object ... params) {     

        this.target = target;     

        this.clazz = target.getClass();     

        rebindMethod(methodName, params);   //设置目标方法     

    }              

    //   重新设置目标方法    

    public void rebindMethod(String methodName, Object ...params) {     

        this.params = params;     

        int paramLength = params.length;     

        Class[] paramTypes = new Class[paramLength];     

        for(int i = 0 ; i < paramLength ; i ++ ) {     

            paramTypes[i] = params[i].getClass();     

        }     

        try {     

            this.method = clazz.getMethod(methodName, paramTypes);     

        } catch (SecurityException e) {     

            e.printStackTrace();     

        } catch (NoSuchMethodException e) {     

            e.printStackTrace();     

        }     

    }     

    //  动态调用已绑定的方法    

    public void doMethod() {     

        try {

            this.method.invoke(target, params);     

        } catch (IllegalArgumentException e) {     

            e.printStackTrace();     

        } catch (IllegalAccessException e) {     

            e.printStackTrace();     

        } catch (InvocationTargetException e) {     

            e.printStackTrace();     

        }     

    }     

}

public class Manager {
     public void say() {     

          System.out.println("Nobody say nothing");     

    } 

    public void love(String boy, String girl) {     

        System.out.println(boy + " love " + girl);     

    }   

}

//代理类

public class TestProxy {
   public static void main(String[] args) {
         Manager man = new Manager();    //目标对象     
         MethodProxy proxy = new MethodProxy(man, "say");    //方法代理对象     
         proxy.doMethod();   //调用被代理的方法     
         proxy.rebindMethod("love", "Tom", "Marry"); //重新绑定方法     
         proxy.doMethod();   //调用被代理的方法   
      }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: