设计模式
来源:互联网 发布:数据对接 英文 编辑:程序博客网 时间: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"); }}
阅读全文
0 0
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式~~~~~~~~~~
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 【接口报错】写接口,返回json给ajax时,一直是error函数接收。
- Linux指令用之记之-tr
- word-wrap和word-break区别详解
- lambda表达式
- 关于json库的简单介绍
- 设计模式
- intellij下实现新建类和方法时的自动注释功能
- 堆区和栈区的区别
- AKKA 官方文档2.5.8——入门指南
- HashSet和TreeSet
- 值的绘制
- 移动硬盘显示由于IO设备错误,无法运行此项请求,要如何找回文件
- Ubuntu16.04超低配版显卡GTX730配置pytorch-gpu+cuda9.0+cudnn
- @responseBody注解