原創(chuàng)|其它|編輯:郝浩|2009-11-18 10:29:39.000|閱讀 732 次
概述:AOP即面向切面編程(Aspect Oriented Programming的縮寫),是OOP(面向?qū)ο缶幊?的一種延續(xù)形式。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
即面向切面編程(Aspect Oriented Programming的縮寫),是OOP(面向?qū)ο缶幊?的一種延續(xù)形式。是通過預編譯方式和運行期動態(tài)代理實現(xiàn)在不修改源代碼的情況下給程序動態(tài)統(tǒng)一添加功能的一種技術(shù),它從一個不同于OOP的角度來看待程序的結(jié)構(gòu):OOP將應用程序分解為一系列表現(xiàn)為繼承關(guān)系的對象; 則把程序分解為一系列方面(aspects)或者關(guān)注點(concerns)。將諸如事務管理等本來橫向分布在多個對象中的關(guān)注點進行了模塊化處理(這些關(guān)注點也常稱為橫切(crosscutting)關(guān)注點)。在中提供了面向切面編程的豐富支持,允許通過分離應用的業(yè)務邏輯與系統(tǒng)級服務(例如審計(auditing)和事務(transaction)管理)進行內(nèi)聚性的開發(fā)。應用對象只實現(xiàn)它們應該做的——完成業(yè)務邏輯——僅此而已。它們并不負責(甚至是意識)其它的系統(tǒng)級關(guān)注點,例如日志或事務支持。
下面我舉個例子來說明這一切:
場景:業(yè)務類CompanyManager在調(diào)用Save方法的時候需要調(diào)用SecurityManager類判斷權(quán)限是否足夠(圖1)。
圖1
準備條件:
第一種實現(xiàn)方式,我們通常會這樣做:直接在CompanyManager類中調(diào)用ISecurityManager接口的IsPass方法判斷權(quán)限。
這樣CompanyManager類與ISecurityManager或SecurityManager會發(fā)生業(yè)務性耦合。聰明的朋友會發(fā)現(xiàn)在GOF(設(shè)計模式)中有一種模式(代理模式)可以解除這種耦合。
第二種實現(xiàn)方式,代理模式(Proxy Pattern):什么是代理模式?是給某一個對象提供一個代理對象,并由代理對象控制對源對象的引用。代理就是一個人或一個機構(gòu)代表另一個人或者一個機構(gòu)采取行動。某些情況下,客戶不想或者不能夠直接引用一個對象,代理對象可以在客戶和目標對象直接起到中介的作用。客戶端分辨不出代理主題對象與真實主題對象。代理模式可以并不知道真正的被代理對象,而僅僅持有一個被代理對象的接口,這時候代理對象不能夠創(chuàng)建被代理對象,被代理對象必須有系統(tǒng)的其他角色代為創(chuàng)建并傳入(圖2)。
圖2
這樣,CompanyManager類就不必與判斷權(quán)限的類SecurityManager耦合,但是這種方式實現(xiàn)起來比較麻煩。
第三種實現(xiàn)方式,提供的:AopAlliance.Intercept.IMethodInterceptor接口和ProxyFactory類的組合。
輸出:保存數(shù)據(jù)
利用System.Reflection.Emit命名空間下的類在運行時動態(tài)創(chuàng)建IL代碼來生成代理。這使得代理(的創(chuàng)建)非常高效,并且不受任何繼承層次的限制。
參考:Spring.NET中文手冊
李會軍博客代理模式
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:博客園