代理模式( Proxy Pattern)
切入故事: 我是遊戲至尊
定義: Provide a surrogate or placeholder for another object to control access to it.(為其他物件提供一種代理以控制對這個物件的訪問。 )
通用類圖:
● Subject抽象主題角色
抽象主題類可以是抽象類也可以是介面, 是一個最普通的業務型別定義, 無特殊要求。
● RealSubject具體主題角色
也叫做被委託角色、 被代理角色。 它才是冤大頭, 是業務邏輯的具體執行者。
● Proxy代理主題角色
也叫做委託類、 代理類。 它負責對真實角色的應用, 把所有抽象主題類定義的方法限制委託給真實主題角色實現, 並且在真實主題角色處理完畢前後做預處理和善後處理工作。
優點:
1: 職責清晰
2: 高擴充套件性
3: 智慧化
使用場景:日誌,事物等
擴充套件:
普通代理: 普通代理就是場景類要知道代理的存在, 也就是類似的GamePlayerProxy這個類的存在
強制代理: 強制代理則是呼叫者直接呼叫真實角色, 而不用關心代理是否存在
動態代理(重點): 動態代理是在實現階段不用關心代理誰, 而在執行階段才指定代理哪一個物件。
例項:AOP, Struts是如何把表單元素對映到物件上的
類圖:
呼叫過程:
注意: DynamicProxy 中的this.obj=Proxy.newProxyInstance(c.getClassLoader(),c.getInterfaces(),new MyInvocationHandler(_obj));
1:作用:建立一個物件
2:過程,c.getClassLoader() 物件的類載入器 c.getInterfaces() 查詢該類的所有介面, 然後實現介面的所有方法。new MyInvocationHandler(_obj) 由InvocationHandler的實現類實現所有的方法, 由其invoke方法接管所有方法的實現
實現動態代理的首要條件是: 被代理類必須實現一個介面
個人總結:
為其他物件提供一個代理,以控制對當前物件的訪問。
在執行時,動態地將程式碼切入到類的指定方法、指定位置上的程式設計思想就是面向切面的程式設計。
理解AOP時,Aspect切面, JoinPoint切入點,Advice通知,Weave織入要深入理解。