C#觀察者模式(Observer Pattern)實(shí)例教程
本文以實(shí)例形式簡(jiǎn)單講述了C#觀察者模式,分享給大家供大家參考。具體實(shí)現(xiàn)方法如下:
現(xiàn)在假設(shè)有一個(gè)軟件公司,每當(dāng)有新產(chǎn)品推出,就把信息通知到一些客戶。
把通知這個(gè)動(dòng)作抽象成一個(gè)接口。代碼如下所示:
public interface IService
{
void Notif();
}
客戶如果想獲得通知,就需要實(shí)現(xiàn)以上的接口。這里的客戶被看作是觀察者。
public class CustomerA : IService
{
public void Notif()
{
Console.WriteLine("客戶A收到通知了~~");
}
}
public class CustomerB : IService
{
public void Notif()
{
Console.WriteLine("客戶B收到通知了~~");
}
}
作為軟件公司來講,維護(hù)著一個(gè)客戶的集合,并提供注冊(cè)、取消注冊(cè)的方法,往這個(gè)集合添加或刪除客戶。每當(dāng)有通知的時(shí)候,就遍歷客戶集合,讓IService執(zhí)行通知。軟件公司可以看作是一個(gè)被觀察對(duì)象,或者說是發(fā)起動(dòng)作的源頭。
public class MyCompany
{
private IList<IService> subscribers = new List<IService>();
public void Subscribe(IService subscriber)
{
subscribers.Add(subscriber);
}
public void CancelSubscribe(IService subscriber)
{
subscribers.Remove(subscriber);
}
public void SendMsg()
{
foreach (IService service in subscribers)
{
service.Notif();
}
}
}
客戶端創(chuàng)建軟件公司實(shí)例、創(chuàng)建觀察者實(shí)例、注冊(cè)或取消觀察者等。
class Program
{
static void Main(string[] args)
{
MyCompany company = new MyCompany();
IService customerA = new CustomerA();
IService customerB = new CustomerB();
company.Subscribe(customerA);
company.Subscribe(customerB);
company.SendMsg();
Console.ReadKey();
}
}
總結(jié):
① 把一個(gè)通知的動(dòng)作抽象成接口
② 觀察者如果想接收到通知,就實(shí)現(xiàn)通知接口
③ 被觀察對(duì)象做3件事情:維護(hù)觀察者的集合,注冊(cè)/取消觀察者,發(fā)起動(dòng)作遍歷觀察者集合讓通知接口來做事
希望本文所述對(duì)大家C#程序設(shè)計(jì)的學(xué)習(xí)有所幫助。
相關(guān)文章
C#面向?qū)ο笤O(shè)計(jì)原則之接口隔離原則
這篇文章介紹了C#面向?qū)ο笤O(shè)計(jì)原則之接口隔離原則,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
C#中Convert.ToDecimal()報(bào)錯(cuò)問題的解決
這篇文章主要給大家介紹了關(guān)于C#中Convert.ToDecimal()報(bào)錯(cuò)問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08
C#使用channel實(shí)現(xiàn)Plc異步任務(wù)之間的通信
在C#的并發(fā)編程中,Channel是一種非常強(qiáng)大的數(shù)據(jù)結(jié)構(gòu),用于在生產(chǎn)者和消費(fèi)者之間進(jìn)行通信,本文將給大家介紹C#使用channel實(shí)現(xiàn)Plc異步任務(wù)之間的通信,文中有相關(guān)的代碼示例供大家參考,感興趣的朋友跟著小編一起來看看吧2024-05-05
利用C#版OpenCV實(shí)現(xiàn)圓心求取實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于如何利用C#版OpenCV實(shí)現(xiàn)圓心求取的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
.net4.5使用async和await異步編程實(shí)例
.net4.5使用async和await異步編程實(shí)例,大家參考使用吧2013-12-12

