第0章:簡介
代理模式定義:爲其他對象提供一種代理以控制對這個對象的訪問
代理模式本質:控制對象訪問
參考:http://chjavach.iteye.com/blog/1630401 ,研磨設計模式(書籍),大話設計模式(書籍)
模式圖:
待補充
第1章:實踐
第0節:靜態代理模式(自定義)
(1)接口(Intf.java)
package com.mcc.core.designPattern.structure.proxy.staticProxy; /** * 接口,被代理和代理對象的公共接口 * * @author <a href="mailto:[email protected]">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:[email protected]">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:[email protected]">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:[email protected]">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:[email protected]">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:[email protected]">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:[email protected]">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:[email protected]">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(); } } |