国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C#對觀察者(Observer)模式的支持(二)

2019-11-17 04:08:29
字體:
來源:轉載
供稿:網友
        .Net為我們應用事件定義了標準的模式,我們在應用過程中應遵守定義事件的規則。一個標準的事件模式包括四個方面的內容:

1、  一個繼承自System.EventArgs類型的事件信息類,并且這個類的名稱以EventArgs結尾,如SendMailEventArgs,這個類負責保存事件源發送給事件監聽者的信息。如果事件源不需要給事件監聽者傳遞額外的信息,可以直接使用EventArgs.Empty,這時我們就不用再去定義自己的事件信息類了。

2、  定義事件時使用的委托(類似于觀察者模式中的抽象主題Subject和抽象觀察者Observer),這個委托返回類型為void,有兩個參數,第一個參數類型為Object,第二個為System.EventArgs或它的子類,名字應以EventHandler結尾,如:

public  delegate void XxxEventHandler(object sender,SendMailEventArgs e);.net框架為我們定義了一個符合事件規范的泛型委托

System.EventHandler<TEventArgs>(Object sender , TeventArgs e) where TeventArgs:EventArgs;

這樣我們在實際應用中就不用再去實現一個自定義委托了,直接用這個泛型委托就可滿足我們應用事件的需要。

3、  一個負責通知事件訂閱者的事件源類(類似于觀察者模式中的具體主題ConcreteSubject),這個類包含一個事件成員,負責向外提供事件的訂閱和注銷接口,并保存他們的狀態;一個負責引發事件的方法以通知所有這個事件的訂閱者,這個方法需要是一個受保護的虛方法,并且是以On開頭以事件名字結尾,并且接受一個類型為System.Eventargs(或子類)的參數。如定義一個事件成員:

public  event EventHandler<SendMailEventArgs>  SendMail;

那么這個方法應為:

PRotected virtual void OnSendMail(SendMailEventArgs e){};

還有一個負責將外部調用或輸入轉化為期望事件的方法,估且叫做觸發器吧。

這個方法負責實例化一個事件消息類,調用引發事件的方法OnXxx,并將事件消息實例傳遞過去。

4、  事件監聽者類(類似于觀察者模式中的具體觀察者ConcreteObserver),用來監聽事件源發出的消息,這個類用來定義和事件相兼容的方法,格式為返回值為void,有兩個參數,第一個參數類型為Object,第二個為相應的事件消息類。例:protected void Phone_SendMail(Object sender,EventArgs e)……;

下面改寫上篇文章中的郵件發送系統:

首先定義一個事件消息類,這個類負責保存向設備發送的消息。

view plaincopy to clipboardprint?
public class SendMailEventArgs:EventArgs   
    {   
        //只讀的信息字段   
        public readonly string Message;   
        public SendMailEventArgs(string message)   
        {   
            this.Message = message;   
        }   
    }  
public class SendMailEventArgs:EventArgs
    {
        //只讀的信息字段
        public readonly string Message;
        public SendMailEventArgs(string message)
        {
            this.Message = message;
        }
    }

事件源類.

view plaincopy to clipboardprint?
class MailManager   
    {   
        //郵件   
        public System.Net.Mail.MailMessage MailMess   
        {   
            set  
            {   
                MailMess = value;   
            }   
            get  
            {   
                return new System.Net.Mail.MailMessage();   
            }   
        }   
        //用.net框架提供的泛型委托定義一個事件   
        public event EventHandler<SendMailEventArgs> SendMail;   
        //負責引發事件的方法   
        protected virtual void OnSendMial(SendMailEventArgs e)   
        {    
            EventHandler<SendMailEventArgs> sendMail=SendMail;   
            if (sendMail != null)   
            {   
                //通知所有訂閱者   
                sendMail(this, e);   
            }   
        }   
        //負責將外部調用轉化為事件   
        public void SendToMail()   
        {   
            if (String.IsNullOrEmpty(MailMess.Subject) || string.IsNullOrEmpty(MailMess.Body))   
            {   
                Console.WriteLine("郵件發送失敗!");   
            }   
            else  
            {   
                Console.WriteLine("發送郵件:{0}", MailMess.Subject);   
                //用郵件的Subject實例化一個事件信息類   
                SendMailEventArgs sendMailEventArgs = new SendMailEventArgs(MailMess.Subject);   
                //通知所有事件訂閱者   
                this.OnSendMial(sendMailEventArgs);   
            }   
        }   
    }  
class MailManager
    {
        //郵件
        public System.Net.Mail.MailMessage MailMess
        {
            set
            {
                MailMess = value;
            }
            get
            {
                return new System.Net.Mail.MailMessage();
            }
        }
        //用.net框架提供的泛型委托定義一個事件
        public event EventHandler<SendMailEventArgs> SendMail;
        //負責引發事件的方法
        protected virtual void OnSendMial(SendMailEventArgs e)
        {
            EventHandler<SendMailEventArgs> sendMail=SendMail;
            if (sendMail != null)
            {
                //通知所有訂閱者
                sendMail(this, e);
            }
        }
        //負責將外部調用轉化為事件
        public void SendToMail()
        {
            if (String.IsNullOrEmpty(MailMess.Subject) || string.IsNullOrEmpty(MailMess.Body))
            {
                Console.WriteLine("郵件發送失敗!");
            }
            else
            {
                Console.WriteLine("發送郵件:{0}", MailMess.Subject);
                //用郵件的Subject實例化一個事件信息類
                SendMailEventArgs sendMailEventArgs = new SendMailEventArgs(MailMess.Subject);
                //通知所有事件訂閱者
                this.OnSendMial(sendMailEventArgs);
            }
        }
    }

事件監聽類

view plaincopy to clipboardprint?
class MobilePhone   
    {  
        #region SendHandler 成員   
  
        public void SendMessage(object sender,SendMailEventArgs e)   
        {   
            Console.WriteLine("手機信息:{0}", e.Message);   
        }  

        #endregion   
    }   
public class RTX   
    {  
        #region SendHandler 成員   
  
        public void SendMessage(object sender,SendMailEventArgs e)   
        {   
            Console.WriteLine("RTX信息:{0}", e.Message);   
        }  

        #endregion   
    }  
class MobilePhone
    {
        #region SendHandler 成員

        public void SendMessage(object sender,SendMailEventArgs e)
        {
            Console.WriteLine("手機信息:{0}", e.Message);
        }

        #endregion
    }
public class RTX
    {
        #region SendHandler 成員

        public void SendMessage(object sender,SendMailEventArgs e)
        {
            Console.WriteLine("RTX信息:{0}", e.Message);
        }

        #endregion
    }



下面是客戶端的調用

view plaincopy to clipboardprint?
class Program   
    {   
        static void Main(string[] args)   
        {   
            //事件監聽源實例   
            MailManager mailManager = new MailManager();   
            //為Mail添加主題和內容   
            mailManager.MailMess.Subject = "通知";   
            mailManager.MailMess.Body = "觀察者模式的學習。";   
            mailManager.SendMail+=new MobilePhone().SendMessage;//注冊手機通知   
              mailManager.SendMail+=new RTX().SendMessage;//注冊RTX通知   
              mailManager.SendToMail();//發送郵件   
              Console.WriteLine("按任意鍵繼續……");   
            Console.ReadKey();   
        }   
    }  
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 化德县| 江西省| 贵溪市| 三明市| 榆社县| 印江| 韶山市| 崇文区| 时尚| 通州区| 绍兴市| 琼海市| 曲水县| 保山市| 广河县| 军事| 祁门县| 阿拉尔市| 襄樊市| 丰原市| 拉萨市| 通河县| 兴和县| 西宁市| 武冈市| 长乐市| 南开区| 定州市| 罗源县| 芮城县| 运城市| 邢台市| 磐石市| 昭苏县| 闽清县| 达尔| 黄平县| 类乌齐县| 灌南县| 清新县| 高雄县|