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