设计模式

来源:互联网 发布:数据对接 英文 编辑:程序博客网 时间:2024/05/22 15:01

1.代理模式

    代码层面解释:

       比如要用java实现一个简单的打印语句:

                 1.定义一个接口A,申明一个打印方法

                 2.定义一个子类B实现这个接口A的打印方法,

                 3.定义了一个子类C,C也实现接口A的打印方法,但方法中并没有去打印输出什么,而是调用类B的对象去打印内容。这个类C就是代理!


             简单类比:

              老爸叫我打扫屋子,说一会来检查,但是我懒不想动,这时我把屋子门关上,叫来弟弟,让他帮打扫,他打扫完毕后,我打开屋子的门,并告诉老爸说我把屋子打扫干净了。我就相当于代理,喜欢做点表面工作,真正打扫屋子的是弟弟,弟弟才是真实的执行者,父亲相当于接口。

1.静态代理

package com.xtm.proxy;public interface Hello {    void sayHello(String s);}

package com.xtm.proxy;public class HelloImp implements Hello {    @Override    public void sayHello(String s) {        System.out.println("Hello:"+s);    }}

package com.xtm.proxy;public class HelloProxy implements Hello {    private final HelloImp helloImp;    public HelloProxy() {        helloImp = new HelloImp();    }    @Override    public void sayHello(String s) {        before();        helloImp.sayHello(s);        after();    }    private void after() {        System.out.println("before");    }    private void before() {        System.out.println("after");    }}

package com.xtm.proxy;public class Main {    public static void main(String args[]){        Hello helloProxy = new HelloProxy();        helloProxy.sayHello("hello!");    }} 


2.动态代理

package com.xtm.dynamic;public interface Hello {    void sayHello(String s);}

package com.xtm.dynamic;public class HelloImp implements Hello {    @Override    public void sayHello(String s) {        System.out.println("Hello:"+s);    }}

package com.xtm.dynamic;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;/** * Author: TianMing.Xiong * Date: Created in 17-12-20 上午9:45 */public class DynamicProxy implements InvocationHandler{    private Object target;    public DynamicProxy(Object target) {        this.target = target;    }    @Override    public Object invoke(Object o, Method method, Object[] args) throws Throwable {        before();        Object result = method.invoke(target, args);        after();        return result;    }    private void after() {        System.out.println("after");    }    private void before() {        System.out.println("before");    }}

package com.xtm.dynamic;import java.lang.reflect.Proxy;public class Main {    public static void main(String args[]){        HelloImp helloImp = new HelloImp();                DynamicProxy dynamicProxy = new DynamicProxy(helloImp);        Hello proxyInstance = (Hello) Proxy.newProxyInstance(                  helloImp.getClass().getClassLoader()                , helloImp.getClass().getInterfaces()                , dynamicProxy);                proxyInstance.sayHello("Jack");    }}

静态代理打印输出:

afterHello:hello!before

动态代理打印输出:

beforeHello:Jackafter

优化一下:

package com.xtm.dynamic;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * Author: TianMing.Xiong * Date: Created in 17-12-20 上午9:45 */public class DynamicProxy implements InvocationHandler{    private Object target;    public DynamicProxy(Object target) {        this.target = target;    }    @SuppressWarnings("unchecked")    public <T> T getProxy(){//泛型方法 T表示可以用任意类型        return (T) Proxy.newProxyInstance(                 target.getClass().getClassLoader()                ,target.getClass().getInterfaces()                ,this                );    }    @Override    public Object invoke(Object o, Method method, Object[] args) throws Throwable {        before();        Object result = method.invoke(target, args);        after();        return result;    }    private void after() {        System.out.println("after");    }    private void before() {        System.out.println("before");    }}

package com.xtm.dynamic;public class Main {    public static void main(String args[]){        HelloImp helloImp = new HelloImp();        DynamicProxy dynamicProxy = new DynamicProxy(helloImp);        Hello proxyInstance = dynamicProxy.getProxy();        proxyInstance.sayHello("Jack");    }}

另外有无接口动态代理库GCLib点击打开链接

package com.xtm.cglib;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;/** * Author: TianMing.Xiong * Date: Created in 17-12-20 上午10:46 */public class CGLibProxy implements MethodInterceptor {        private CGLibProxy() {    }        private static CGLibProxy instance = new CGLibProxy();        public <T> T getProxy(Class<T> cls){        return (T) Enhancer.create(cls,this);    }    public static CGLibProxy getInstance(){        return instance;    }        //obj 被代理的对象    @Override    public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {        before();        Object result = methodProxy.invokeSuper(obj, args);        after();        return result;    }    private void after() {        System.out.println("after");    }    private void before() {        System.out.println("before");    }}

package com.xtm.dynamic;import com.xtm.cglib.CGLibProxy;public class Main {    public static void main(String args[]){        HelloImp proxy = CGLibProxy.getInstance().getProxy(HelloImp.class);        proxy.sayHello("Jack");    }}


原创粉丝点击