設計模式之結構型--代理模式
阿新 • • 發佈:2018-08-02
類和對象 mic div att 機票 name void out pro
代理模式(Proxy pattern)
核心作用:
通過代理,控制對對象的訪問
可以詳細控制訪問某個(某類)對象的方法,在調用這個方法前做前置處理,調用這個方法後
做後置處理(即:AOP的微觀實現)
----AOP(Aspect Oriented Programming面向切面編程)的核心實現機制
--核心角色:
抽象角色:
定義代理角色和真實角色的公共對外方法,(一個接口,真實角色和代理角色都要去實現這個接口)
真實角色
實現抽象角色,定義真實角色所要實現的業務邏輯供代理角色調用
代理角色
實現抽象角色,是真實角色的代理,通過真實角色的業務邏輯方法來實現
抽象方法,並可以附加自己的操作(外部只會去訪問代理類,代理再調用真實角色的方法)
將統一的流程控制放到代理角色中處理
靜態代理容易實現(省略)
動態代理(JDK自帶的實現)
--java.lang.reflect.Proxy
作用:動態生成代理類和對象
--java.lang.reflect.InvocationHander(處理器接口)
可以通過invoke方法實現對真實角色的代理訪問
每次通過Proxy生成代理類對象時都要指定對應的處理器對象
動態代理實例:
package com.luruixiao.pattern.dynamicProxy; public interface Star { /** *面談 */ void confer(); /** * 簽合同 */ void signContract(); /** * 訂票 */ void bookTicket(); /** * 唱歌 */ void sing(); /** * 收錢 */ void collectMoney(); }
package com.luruixiao.pattern.dynamicProxy; public class RealStar implements Star{ @Override public void confer() { System.out.println("RealStar.confer()"); } @Override public void signContract() { System.out.println("RealStar.signContract()"); } @Override public void bookTicket() { System.out.println("RealStar.bookTicket()"); } @Override public void sing() { System.out.println("本人RealStar.sing()"); } @Override public void collectMoney() { System.out.println("RealStar.collectMoney()"); } }
package com.luruixiao.pattern.dynamicProxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class StarHandler implements InvocationHandler{ Star realStar; public StarHandler(Star realStar) { super(); this.realStar = realStar; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object obj = null; System.out.println("真正方法執行前"); System.out.println("面談,簽合同,預付款,訂機票"); if(method.getName().equals("sing")) { obj = method.invoke(realStar, args); } System.out.println("真正方法執行後"); System.out.println("收尾款"); return obj; } }
package com.luruixiao.pattern.dynamicProxy; import java.lang.reflect.Proxy; public class Client { public static void main(String[] args) { Star realStar = new RealStar(); StarHandler handler = new StarHandler(realStar); Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[] {Star.class},handler); // proxy.bookTicket(); proxy.sing(); } }
設計模式之結構型--代理模式