第0章:简介
代理模式定义:为其他对象提供一种代理以控制对这个对象的访问
代理模式本质:控制对象访问
参考:http://chjavach.iteye.com/blog/1630401 ,研磨设计模式(书籍),大话设计模式(书籍)
模式图:
待补充
第1章:实践
第0节:静态代理模式(自定义)
(1)接口(Intf.java)
package com.mcc.core.designPattern.structure.proxy.staticProxy; /** * 接口,被代理和代理对象的公共接口 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-12 下午10:20 */ public interface Intf { public void someMethod(); } |
(2)实现类(IntfImpl.java)
package com.mcc.core.designPattern.structure.proxy.staticProxy; /** * 实现类,被代理的对象 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-12 下午10:22 */ public class IntfImpl implements Intf { @Override public void someMethod() { System.out.println("被代理对象的方法"); } } |
(3)代理对象(StaticProxy.java)
package com.mcc.core.designPattern.structure.proxy.staticProxy; /** * 代理对象,同样实现接口,本例是静态代理 * * 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问 * 代理模式的本质:控制对象访问 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-12 下午10:23 */ public class StaticProxy implements Intf { //持有被代理的具体对象 private Intf intf; /** * 构造器,传入被代理的具体目标对象 * @param intf */ public StaticProxy(Intf intf){ this.intf = intf; } /** * 代理方法 */ @Override public void someMethod() { //这里是调用前业务逻辑 System.out.println("调用被代理对象方法前的操作"); //调用被代理对象的方法 intf.someMethod(); //这里是调用后业务逻辑 System.out.println("调用被代理对象方法后的操作"); } } |
(4)客户端测试(Client.java)
package com.mcc.core.designPattern.structure.proxy.staticProxy; /** * 客户端测试 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-12 下午10:30 */ public class Client { public static void main(String args[]){ System.out.println("不通过代理调用:"); //调用被代理对象(目标对象)方法 Intf intf1 = new IntfImpl(); intf1.someMethod(); System.out.println("通过代理调用:"); //通过代理对象使用被代理对象方法,加入其他操作 Intf intf2 = new StaticProxy(intf1); intf2.someMethod(); } } |
第1节:动态代理模式(java自带)
(1)接口(Intf.java)
package com.mcc.core.designPattern.structure.proxy.dynamicProxy; /** * 接口,被代理对象的接口 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-12 下午10:20 */ public interface Intf { public void someMethod(); } |
(2)实现类(IntfImpl.java)
package com.mcc.core.designPattern.structure.proxy.dynamicProxy; /** * 实现类,被代理的对象 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-12 下午10:22 */ public class IntfImpl implements Intf { @Override public void someMethod() { System.out.println("被代理对象的方法"); } } |
(3)代理对象(DynamicProxy.java)
package com.mcc.core.designPattern.structure.proxy.dynamicProxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * 代理对象,使用java中的动态代理 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-12 下午10:41 */ public class DynamicProxy implements InvocationHandler{ //持有被代理的具体对象 private Intf intf; /** * 获取绑定好代理对象和被代理的目标对象后的目标对象的接口 * @param intf */ public Intf getProxyInterface(Intf intf){ this.intf = intf; //把目标对象和动态代理关联起来 Intf result = (Intf)Proxy.newProxyInstance( intf.getClass().getClassLoader(), intf.getClass().getInterfaces(), this); return result; } /** * 复写java的调用方法 * @param proxy * @param method * @param args * @return * @throws Throwable */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //这里是调用前业务逻辑 System.out.println("调用被代理对象方法前的操作"); //调用被代理对象的方法 Object obj = method.invoke(intf,args); //这里是调用后业务逻辑 System.out.println("调用被代理对象方法后的操作"); return obj; } } |
(4)客户端测试(Client.java)
package com.mcc.core.designPattern.structure.proxy.dynamicProxy; /** * 客户端测试 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-12 下午10:49 */ public class Client { public static void main(String args[]){ System.out.println("不通过代理调用:"); //调用被代理对象(目标对象)方法 Intf intf1 = new IntfImpl(); intf1.someMethod(); System.out.println("通过代理调用:"); //通过代理对象使用被代理对象方法,加入其他操作 DynamicProxy DynamicProxy = new DynamicProxy(); //通过代理对象获取目标对象 Intf intf2 = DynamicProxy.getProxyInterface(intf1); intf2.someMethod(); } } |