網站首頁 編程語言 正文
在觀察者模式中有2個要素:一個是被觀察對象,另一個是觀察者。但被觀察對象的狀態發生改變會通知觀察者。
舉例:把訂閱報紙的人看作是觀察者,把報紙看作被觀察對象。每當有新的新聞就要通知訂閱報紙的人。本篇分別用實現接口和使用委托事件的方式來實現。
通過實現接口實現
觀察者接口,把接收到的新聞顯示出來。
public interface IObserver
{
void Update(string news);
}
被觀察對象接口,提供3個方法:注冊觀察者,取消觀察者,通知觀察者。
public interface ISubject
{
void RegisteerObserver(IObserver o);
void RemoveObserver(IObserver o);
void NotifyObservers();
}
被觀察對象實現類,維護著一個觀察者接口的集合,對觀察者的注冊和取消實際上是往這個集合添加或移除數據。
public class NewsPublisher : ISubject
{
private List<IObserver> observers = new List<IObserver>();
private List<string> newsList = new List<string>();
public void RegisteerObserver(IObserver o)
{
observers.Add(o);
}
public void RemoveObserver(IObserver o)
{
observers.Remove(o);
}
public void NotifyObservers()
{
foreach (IObserver o in observers)
{
o.Update(newsList[newsList.Count - 1]);
}
}
public void PublishNews(string news)
{
newsList.Add(news);
NotifyObservers();
}
}
另外,被觀察對象實現類還維護著一個string類型的新聞集合,每當發布新聞,就往這個集合里添加數據,并通知所有的注冊觀察者。
觀察者的實現類。
public class NewsSubscriber : IObserver
{
public void Update(string news)
{
Console.WriteLine("收到通知了");
Console.WriteLine(news);
}
}
客戶端,被觀察對象注冊觀察者并觸發動作。
class Program
{
static void Main(string[] args)
{
NewsPublisher publisher = new NewsPublisher();
NewsSubscriber subscriber = new NewsSubscriber();
publisher.RegisteerObserver(subscriber);
publisher.PublishNews("看報,看報,快來看報~");
Console.ReadKey();
}
}
使用委托事件實現
看到以上的做法,委托和事件這對好朋友就笑了。注冊、取消觀察者還得用2個方法,那讓我們情何以堪?我們這樣做:
觀察者類只負責對收到的新聞顯示。
public class NewsSubscriber
{
public void Update(string news)
{
Console.WriteLine("收到新聞了~");
Console.WriteLine(news);
}
}
被觀察對象類用到了委托和事件。
public class NewsPublisher
{
private readonly List<string> newsList = new List<string>();
public delegate void NotifyOvserversHandler(string news);
public event NotifyOvserversHandler newsPublished;
public void PublishNews(string news)
{
newsList.Add(news);
newsPublished(newsList[newsList.Count - 1]);
}
}
以上,委托聲明了方法的定義,接收一個string類型參數,返回void。事件負責對符合委托定義的、觀察者方法的注冊和取消。
在客戶端使用事件對方法進行注冊。
class Program
{
static void Main(string[] args)
{
NewsPublisher publisher = new NewsPublisher();
NewsSubscriber subscriber = new NewsSubscriber();
publisher.newsPublished += subscriber.Update;
publisher.PublishNews("現在是看報時間~");
Console.ReadKey();
}
}
與通過接口實現不同,使用事件注冊的是觀察者的方法,而不是觀察者本身。
總結:無論通過接口實現,還是使用委托和事件,觀察者模式的要素是不變的:被觀察對象,觀察者,被觀察者提供注冊、取消觀察者或觀察者方法,通過被觀察對象的某個方法觸發、通知觀察者。
原文鏈接:https://www.cnblogs.com/darrenji/p/3966626.html
- 上一篇:C#各種異常處理方式總結_C#教程
- 下一篇:C#中數組擴容的幾種方式介紹_C#教程
相關推薦
- 2022-10-17 安卓開發之FragmentPagerAdapter和FragmentStatePagerAdapte
- 2022-05-12 Android 11 適配存儲權限
- 2022-06-29 python人工智能tensorflow函數tf.nn.dropout使用方法_python
- 2023-07-27 Android解決全屏時虛擬導航欄留一截的問題
- 2022-06-25 iOS開發CGContextRef畫圖使用總結_IOS
- 2022-07-30 python?replace?空格數據處理的實現_python
- 2023-11-13 Linux Ubuntu修改用戶名和主機名
- 2022-08-18 go-spew調試利器詳解_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支