1. 程式人生 > >Spring系列(3/4)----一個較為完善的模型(續)

Spring系列(3/4)----一個較為完善的模型(續)

接上篇:

4、我們知道我們進行動態代理的目的是為了附加責任,也就是在目標類方法執行的時候,我們能增加一些附加的功能。我們前面的模型雖然可以達到這個目的,但通訊資訊不夠。觀察者雖然可以獲取目標類,但無法知道當前執行的方法和引數值,這在有些情況下雖然沒什麼不利,但既然我們的目標其實就是監視目標類的方法的執行,能有目標類執行方法時的方法資訊和當前實際引數的資訊,當然是更好了,為此,我們可以專門增加一個引數型來封裝這些,便於呼叫統一:

  public interface INotifyInvocation
    {
        object Target { get; set; }
        object Proceed();
        object[] Params{get;}//可選
        MethodInfo MethodInfo{get;}//可選
    }

//上面的介面是否公佈方法資訊和引數,需看自己的需要決定。

public class NotifyInvocation : INotifyInvocation
    {
        #region INotifyInvocation成員
        private object _target;
        private MethodInfo _currMethod;
        private object[] _parmas;
        public NotifyInvocation (object target, MethodInfo method, object[] parmas)
        {
            _target = target;
            _currMethod = method;
            _parmas = parmas;

        }
        public object Target
        {
            get
            {
                return _target;
            }
            set
            {
                _target = value;
            }
        }

      object[] Params
     {
         get{return _params;}
     }
     MethodInfo MethodInfo{
            get{return _currMethod;
     }

    public object Proceed()
    {
             return _currMehtod.Invoke(_target, _parmas);
    }

    #endregion

 類NotifyInvocation作為互動時的引數型別,注意這裡的引數有執行方法,這個方法就是簡單的呼叫目標類的相應方法,這個主要提供給附加責任類來執行目標類的方法,而在代理類中一般還有一個呼叫,那個是給目標類原來的呼叫者的。這樣做當然有好處,但如果執行這個方法本身會影響目標類的狀態,那就要注意了,因為附加責任類的多次呼叫,可能會使得本來的呼叫者得到不可預期的結果,因此,我們採用這種方式的時候一定要求目標方法是呼叫無狀態的,既多次呼叫不影響原呼叫者的呼叫結果。