观察者模式: 是通信模式里面的一种, 当被观察者发生变化时, 可以通知一组观察者,从而每个观察者可以同时响应.
为了让这组观察者都可以响应,因此引入了观察者的接口IObserver,这样每个观察者虽然彼此不同,但是都可以从此接口派生,并进而响应。
由此也可以初窥接口的这个强大功能。
事件:C#编程的一个原则就是UI和数据处理模块尽量分开,那么当我数据发生变化,然后也需要UI界面发生对应的变化怎么办呢?一个比较好的处理方式就是使用事件。
步骤一:在数据处理单元,定义事件
#regionEvent notify
///
/// To notifyto write TDSP serial port, to query SID and angle.
///
public delegatevoid EventDelegate();
public eventEventDelegate NotifyTDSP;
///
/// To notifylabDAP control to change its text to DAP value.
///
///
public delegatevoid EventLableDAPDelegate(double dapValue);
public eventEventLableDAPDelegate NotifyLabDAP;
#endregion
由此可见,定义事件有2个特点:
1. 需要使用委托,委托是C#的一个要求,和回调函数差不多,没有什么特别的含义,可以当它就是多穿了一件衣服而已,这样更安全。
2. 定义委托的时候是可以带上参数的,只要和后面订阅时间的时候传入的函数的参数格式保持一致就行。
步骤二:在UI界面代码模块,订阅这个事件,可以认为就是告诉UI界面当这个事件发生的时候,该做哪些事情,这个事情都放在函数里面了。
private bool InitIBAComm()
{
ibacomm.SetPort("COM2", 38400, Parity.None,StopBits.One, 8, Handshake.None);
ibacomm.Open();
if(ibacomm.IsOpen)
{
ibaObserver = new ObserverDoseInfo();
ibaObserver.NotifyLabDAP += newObserverDoseInfo.EventLableDAPDelegate(UpdateLabDAP);
ibaObserver.NotifyTDSP += new ObserverDoseInfo.EventDelegate(UpdateFactor);
ibacomm.Register(ibaObserver);
ibacomm.WritePortStr("%AD");
returntrue;
}
returnfalse;
// 如果打开失败呢?
}
private voidUpdateLabDAP(double dap)
{
this.labDAP.Text= dap.ToString();
}
privatevoid UpdateFactor()
{
if(tdspcomm.IsOpen)
{
tdspcomm.QuerySIDAngle();
}
}