ProxyPattern与AOP

代理就是对一个类进行的代理,或是托管。简单的讲就是对原有类加了一个壳,当程序执行的时候不执行原来的类,首

先执行代理类,代理类,可以决定是否执行真正要调用的类。用途,最常见的就是数据库连接池,数据库连接池里的连

接是不能被关闭的,那么,你总不能单独写一个connectionClose方法吧?所以就要代理掉Conection接口的实现类

(java的代理是面向接口的代理),代理类判断当执行的方法是close方法的时候就不予执行close操作。其他就是

spring中的aop,大量用到了代理。事实上,struts的拦截器也是一种代理。

代理 故名思议  带替你去处理   

ProxyObject{
    RealObject  real;
    dosth()
    {
         //委托
         real.dosth();   //现实世界里,委托是将本人的责任托付给别人,而此Pattern中正好相反
    }

    private synchronized void realize
    {
         if(real==null)
        real=new RealObject();

    }
}
用处之一: eg:GoF一书中所举的ProxyPattern例子,是一个内嵌图形对象的文件编辑器,因为欲产生图形对象要花很

长时间,每次开启文件都产生图形对象的话很浪费时间,。其实在等到图形对象要输出到画面上时再去产生比较好。而

ProxyPattern此时就能发挥它的作用。



Collection collProxyObj=(Collection) Proxy.newProxyInstance(Collection.class.getClassLoader(), new Class[]

{Collection.class}, new InvocationHandler() {
            ArrayList target=new ArrayList ();
            public Object invoke(Object proxy, Method method, Object[] args)
                    throws Throwable {
                
                
                System.out.println("执行的方法是:"+method.getName());
                return method.invoke(target, args);
                             // 若method.invoke(proxyObj, args); 则死循环


    /*返回:
从代理实例的方法调用返回的值。如果接口方法的声明返回类型是基本类型,则此方法返回的值一定是相应基本包装对

象类的实例;否则,它一定是可分配到声明返回类型的类型。如果此方法返回的值为 null 并且接口方法的返回类型是基

本类型,则代理实例上的方法调用将抛出 NullPointerException。否则,如果此方法返回的值与上述接口方法的声明返

回类型不兼容,则代理实例上的方法调用将抛出 ClassCastException。*/

            }
        });


JS中:
var i=0;
 eval("i++;i+=7");    //通过传递str串   插入一段代码
 alert(i);
Java中却不可以,那怎么样插入一段代码 实现面向切面的编程呢,传递对象,调用对象的方法,实现插入一段代码相同

的作用。。
Collection collProxyObj=(Collection) Proxy.newProxyInstance(Collection.class.getClassLoader(), new Class[]

{Collection.class}, new InvocationHandler(Logger log,Security  sec){});这样  就切入了 日志和安全审计的功能。

你可能感兴趣的:(ProxyPattern与AOP)