C#小结: 通信 观察者模式 ,事件使用

观察者模式: 是通信模式里面的一种, 当被观察者发生变化时, 可以通知一组观察者,从而每个观察者可以同时响应.

为了让这组观察者都可以响应,因此引入了观察者的接口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();

            }

        }

你可能感兴趣的:(c#,ui,query,编程)