首頁 後端開發 C#.Net教程 C#設計模式-觀察者模式的另類的範例程式碼總結

C#設計模式-觀察者模式的另類的範例程式碼總結

Mar 18, 2017 pm 01:28 PM

訂閱-分發模式,又叫觀察者模式,那麼這種模式它的實作機制是什麼?它該如何在產品開發上實際應用呢? 我們學一種模式,最好不要死板的去學它,可以分佈根據業務的需求將偽代碼逐漸轉化為真正的代碼。自己畫畫圖,編編碼,體會這種機制,這樣完全實踐一遍後,才能真正用於以後的產品開發。

寫完後,畫的類別圖:


C#設計模式-觀察者模式的另類的範例程式碼總結


#首先,透過名字看出,得先訂閱,然後,等到發送人,或者叫主辦方,寫好東西後,比如一篇體育新聞,最新熱點,點擊發送,這樣會發送給所有訂閱這個節目的人。

那麼,我們看到這個關係是典型的一對多的關係,比如一是指主辦單位,多是指那些訂閱了這個報刊的個人,可能是10幾個,或成千上萬個。這麼些訂閱人中,可能一類是體育迷,一類是官場混的。

因此,我們先建立一個主辦方的模型:

public class Sender 
{   //主办方,此处称为消息发送者}
登入後複製

還得有想訂閱這些報刊的人的模型:

public class Receiver 
{   //订阅报刊的人,此处称为接受者
   private string _name;   private Subject _sub;   public Receiver(string name, Subject sub)
   {       this._name = name;       this._sub = sub;    
   }
}
登入後複製

並且,注意此處,訂閱報紙的人可能有多個呢!所有建立一個訂閱這些報紙的人的集合類別:

public class ReceiverCollection
{   //这个集合维护着订阅报刊的人

   //封装一个订阅人的列表
   private List<Receiver> _receivers = new List<Receiver>();   public List<Receiver> ReceiverList
   {     get
     {       return _receivers;
      }
   }    //管理订阅人:增加一个订阅人,移除一个,统计人数
    public void AddReceiver(Receiver r)
    {       this._receivers.Add(r);
    }    public void RemoveReceiver(Receiver r)
    {       if(this._receivers.Contains(r))           this._receivers.Remove(r);       else 
          throw new ArgumentException("此人未订阅此报刊");
    }    public int ReceiverCount
    {       get
       {          return _receivers.Count;
       }
    }

}
登入後複製

好了,我們有了主辦方對象的架子,訂閱人對象,訂閱人集合對象,用來管理訂閱人。一對多的模型架已經架起來了,接下來,我們該實作這些物件各自的行為了!

我們知道,主辦單位要在分發之前,就得掌握需要分發給哪些人,除了知道給誰發之外,主辦方還要想好稿子,也就是發佈內容或主題完成後,下一步,把內容或主題寄給所有的訂閱人!

那麼主辦單位的這個行為,兌現為程式碼,是怎麼樣的呢?在已有架子的基礎上,修改

public class Sender 
{   //主办方,此处称为消息发送者

   //要知道分发给哪些人
   private ReceiverCollection _receColl;   public Sender(ReceiverCollection receColl)
   {     this._receColl = receColl;
   }   //主办方确定 分发主题
   public List<Subject> SendingSubjects {get; set;}   //主办方通知多个订阅人
    public void Notify()
    {       //执行更新事件
       UpdateEvent();
    }    //因此需要定义一个主办方在通知订阅人时,执行的更新事件
    //事件搭载各类订阅人在收到主题后的行为!!!
    //当事件触发时,回调搭载的各类订阅人收到主题后的行为!!!
    public delegate void MyEventHandler();    public event EventHandler UpdateEvent;
}
登入後複製

分發主題Subject 的模型為:

public class Subject
{   //主题话题
   public string Topic {get;set;}   //主题摘要
   public string SubAbstract {get;set;}   //主题内容
   public string Content {get;set;}
}
登入後複製

各個物件模型及各自的行為都寫好後,我們就可以使用這些物件了。

首先,主辦單位定義了兩個主題,

            ReceiverCollection receColl = new ReceiverCollection();
            Sender sender = new Sender(receColl );
            Subject sportSubject = new Subject()
            {
                Topic = "Sport",
                SubAbstract = "篮球,足球,乒乓球",
                Content = "2018年俄罗斯世界杯,今天晚上国足迎来出线的关键争夺战!"
            };
            sender.SendingSubjects.Add(sportSubject);
            Subject newsSubject = new Subject()
            {
                Topic = "News",
                SubAbstract = "国内大事 国际纵横",
                Content = "十九大,即将召开,请前来参会!"
            };
登入後複製

新增一個訂閱人的介面,兩類訂閱人對象,當UpdateEvent事件觸發時,回呼搭載的各類訂閱者收到主題後的行為,比如說看到主題今晚國足有比賽後,郝海東會看比賽。

public interface IResponse
{    void WillDo();   
}public class SportsReceiver:Receiver,IResponse
{   public void WillDo()
   {
      Console.WriteLine("I will watch tv tonight, good luck for gays"); 
   }  public SportsReceiver(string name, Subject subject)
            : base(name, subject)
        {

        }
}public class NewsReceiver:Receiver,IResponse
{   public void WillDo()
   {
      Console.WriteLine("I am going to Beijing to meeting"); 
   }   public NewsReceiver(string name, Subject subject)
            : base(name, subject)
        {

        }
}
登入後複製

然後添加2個訂閱者

//添加一位体育大牛:郝海东receColl.AddReceiver(new SportReceiver("Hao Haidong", sender.newsSubjects[0]));
//添加县长:钱烈贤receColl.AddReceiver(new NewsReceiver("Qian Liexian", sender.newsSubjects[1]));
登入後複製

確定主辦方發送後,訂閱者的行為,這裡採取先註冊,後發送主題後,回調的方式,觸發訂閱者的行為:

//要在此处注册订阅者看到消息后的反应foreach(var rece in receColl)
  sender.UpdateEvent += new MyEventHandler(rece.WillDo);
登入後複製

主辦單位開始發送主題給訂閱者:

sender.Notify();
登入後複製

這樣,收到主辦單位發送的訊息後,訂閱人回調他們的WillDo的方法,這樣整個訂閱-分發-回調的過程就閉合了! ! !


以上是C#設計模式-觀察者模式的另類的範例程式碼總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1424
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
使用 C# 的活動目錄 使用 C# 的活動目錄 Sep 03, 2024 pm 03:33 PM

使用 C# 的 Active Directory 指南。在這裡,我們討論 Active Directory 在 C# 中的介紹和工作原理以及語法和範例。

C# 中的隨機數產生器 C# 中的隨機數產生器 Sep 03, 2024 pm 03:34 PM

C# 隨機數產生器指南。在這裡,我們討論隨機數產生器的工作原理、偽隨機數和安全數的概念。

C# 資料網格視圖 C# 資料網格視圖 Sep 03, 2024 pm 03:32 PM

C# 資料網格視圖指南。在這裡,我們討論如何從 SQL 資料庫或 Excel 檔案載入和匯出資料網格視圖的範例。

C# 中的階乘 C# 中的階乘 Sep 03, 2024 pm 03:34 PM

C# 階乘指南。這裡我們討論 C# 中階乘的介紹以及不同的範例和程式碼實作。

c#多線程和異步的區別 c#多線程和異步的區別 Apr 03, 2025 pm 02:57 PM

多線程和異步的區別在於,多線程同時執行多個線程,而異步在不阻塞當前線程的情況下執行操作。多線程用於計算密集型任務,而異步用於用戶交互操作。多線程的優勢是提高計算性能,異步的優勢是不阻塞 UI 線程。選擇多線程還是異步取決於任務性質:計算密集型任務使用多線程,與外部資源交互且需要保持 UI 響應的任務使用異步。

C# 中的模式 C# 中的模式 Sep 03, 2024 pm 03:33 PM

C# 模式指南。在這裡,我們討論 C# 中模式的介紹和前 3 種類型,以及其範例和程式碼實作。

C# 中的質數 C# 中的質數 Sep 03, 2024 pm 03:35 PM

C# 質數指南。這裡我們討論c#中素數的介紹和範例以及程式碼實作。

xml怎麼改格式 xml怎麼改格式 Apr 03, 2025 am 08:42 AM

可以採用多種方法修改 XML 格式:使用文本編輯器(如 Notepad )進行手工編輯;使用在線或桌面 XML 格式化工具(如 XMLbeautifier)進行自動格式化;使用 XML 轉換工具(如 XSLT)定義轉換規則;或者使用編程語言(如 Python)進行解析和操作。修改時需謹慎,並備份原始文件。

See all articles