程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#模擬攔截器的實現

C#模擬攔截器的實現

編輯:C#入門知識

在SSH項目開發的過程中,Struts中大部分的功能是通過攔截器實現的。從編程思想上講,攔截器也是AOP的實現。這裡通過C#代碼來模擬一個簡單的攔截器。 首先來看一段代碼,這段代碼是一段錯誤代碼,因為會陷入無窮的循環調用中 [csharp]   public class A   {       B b = new B();          public void invoke()       {           b.Method(this);       }   }      public class B   {       public void Mehtod(A a)       {           a.invoke();       }   }     其實攔截器的實現跟這個方式很像,struts在ActionInvoke上做得很好,所以使整個流程很有邏輯。可以看到,在ActionInvoke的invoke方法中,index扮演者一個非常重要的分流角色,避免與Interceptor之間的陷入無盡的相互調用之中。下面是模擬攔截器的完整代碼 [csharp]   class Program       {           static void Main(string[] args)           {               Action a = new Action();               ActionInvocation invoker = new ActionInvocation(a);               invoker.invoke();               Console.ReadLine();           }       }          public class Action       {           public void Execute()           {               Console.WriteLine("Action invoked");           }       }          public interface Interceptor       {           void Intercept(ActionInvocation actionInvocation);       }          public class Interceptor1 : Interceptor       {           public void Intercept(ActionInvocation actionInvocation)           {               Console.WriteLine("=======*1");               actionInvocation.invoke();               Console.WriteLine("=======*-1");           }       }          public class Interceptor2 : Interceptor       {           public void Intercept(ActionInvocation actionInvocation)           {               Console.WriteLine("=======*2");               actionInvocation.invoke();               Console.WriteLine("=======*-2");           }       }                public class ActionInvocation       {              List<Interceptor> interceptors = new List<Interceptor>();           int index = -1;           Action action = null;              public ActionInvocation(Action action)           {               this.action = action;               this.interceptors.Add(new Interceptor1());               this.interceptors.Add(new Interceptor2());           }              public void invoke()           {               index++;               if (index >= this.interceptors.Count)               {                   action.Execute();               }               else               {                   this.interceptors[index].Intercept(this);               }           }       }   接下來用一張圖片對這個流程進行簡單的分析   整個的調用過程中 Step1,index=0,調用Interceptor1的Intercept()方法,輸出=======*1 Step2,調用actionInvoke的invoke方法 Step3,因為此時index=1,所以繼續調用Interceptor2的Intercept()方法,輸出======*2 Step4,在Interceptor2的Intercept()方法中,再次回到了actionInvoke的invoke方法,執行action.Execute() Step5,接著執行Interceptor2的Intercept()中的輸出命令,輸出======*-2 Step6,回到上一層的調用中,回到Interceptor1的Intercept()中的輸出命令,輸出=======*-1 至此,這個過程結束。     總體上看,是從invoke()中開始執行到Interceptor1的時候,再次調用invoke方法,就會在Interceptor1的執行區間內,包裹一個Interceptor2執行。當Interceptor2完事後,會繼續回到Interceptor1執行剩下的邏輯,這裡是輸出字符串。

  1. 上一頁:
  2. 下一頁: