AOP(面向切面)的粗俗理解

百度百科的解釋:AOP主要實現的目的是針對業務處理過程當中的切面進行提取,它所面對的是處理過程當中的某個步驟或階段,以得到邏輯過程當中各部分之間低耦合性的隔離效果。ide

一個比較繞的概念,簡單來講就是把不影響業務流程的功能獨立封裝出來,不用在須要使用該功能的方法中顯示調用該方法。spa

代碼爲例:日誌

public void Edit(Book book)
{
        //驗證用戶是否有權限的代碼
        //方法的主體邏輯
        //記錄操做日誌的代碼
}        

在上面的方法中,只有主體邏輯纔是這個方法的核心,權限和日誌都不影響該邏輯的具體實現,若是把具體方法都寫在這裏則會顯得臃腫,同時耦合度很高,若是出現多個地方擁有相同代碼一旦變動則變得很麻煩,咱們能夠將權限和日誌拆分紅兩個獨立方法,封裝到不一樣類裏面去,從而使得方法內部耦合性下降,方法和類的功能單一。code

public class Role
{
public static bool IsOk(User user)
{
//驗證權限的具體代碼 } } ; public class Log
{
public static void LogText(User user,Book book)
{
//記錄日誌的具體代碼 } } ; /*上文提到的方法*/ public void Edit(Book book)
{
if(Role.IsOk(Session["User"])) { // do something... }else{ // do something... } //方法的主體邏輯 Log.LogText(Session["User"],book); }

以上是常規方法中用到的解耦方法,而有了AOP以後怎麼作呢,拿過ASP.NET MVC的濾器舉例blog

public class RoleFilterAttribute : ActionFilterAttribute
{
         public override void OnActionExcuting(ActionExecutingContext filterContext)
         { 
            //驗證權限代碼
         }
};
public class LogFilterAttribute : ActionFilterAttribute
{
         public override void OnActionExcuted(ActionExecutingContext filterContext)
         { 
            //記錄日誌代碼
         }
};
/*原來的方法*/
[LogFilter]
[RoleFilter]
public void Edit(Book book){
    //主體邏輯
}

有了切面以後,跟主體邏輯無關的變動只須要在過濾器中更改就能夠了,原來的方法去除這些無關的功能後代碼顯得更清晰。it

至於過濾器怎麼實如今Eidt執行前調用權限驗證或者在執行結束後記錄日誌,則已經超出面向切面概念的理解。io

相關文章
相關標籤/搜索