在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執行剩下的邏輯,這裡是輸出字符串。