
C#观察者模式详解:实时通知与应用实例
85KB |
更新于2024-08-30
| 53 浏览量 | 举报
收藏
"C#观察者模式实例介绍"
观察者模式是一种设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象(被观察者)的状态发生改变时,所有依赖于它的对象(观察者)都能得到通知并自动更新。这种模式适用于那些需要处理大量对象之间复杂交互的场景,尤其是当一个对象的变化可能会影响到多个其他对象,但具体数量不固定的情况下。
在C#中,观察者模式通常通过以下几个步骤实现:
1. 定义观察者接口:
抽象类`Observer`是观察者模式的核心,它包含了观察者的基本行为。在这个例子中,抽象方法`Update()`定义了当被观察者状态变化时观察者需要执行的操作。例如:
```csharp
abstract class Observer
{
protected string name;
protected ISubject sub;
public Observer(string name, ISubject sub)
{
this.name = name;
this.sub = sub;
}
public abstract void Update();
}
```
2. 创建具体观察者:
具体的观察者类(如`NBAObserver`和`StockObserver`)继承自`Observer`,实现`Update()`方法来响应不同的观察事件。例如,`NBAObserver`关闭NBA直播,而`StockObserver`可能执行股票相关的操作。
```csharp
// 使用面向对象的方式实现
class NBAObserver : Observer
{
// ...
public override void Update()
{
Console.WriteLine($"{sub.SubjectState} {name}关闭NBA直播,继续工作!");
}
}
class StockObserver : Observer
{
// ...
public override void Update()
{
// 实现股票操作逻辑...
}
}
```
3. 定义被观察者接口:
被观察者接口(如`ISubject`或`ISubject2`)包含状态和通知观察者的方法。这里没有直接给出,但通常包括一个`Subscribe`方法用于添加观察者,以及一个`Unsubscribe`方法用于移除观察者。当主体状态改变时,调用`NotifyObservers()`方法通知所有已订阅的观察者。
```csharp
interface ISubject
{
event Action SubjectStateChanged;
void Subscribe(Observer observer);
void Unsubscribe(Observer observer);
string SubjectState { get; set; }
}
```
4. 建立关联和通信:
在实际应用中,被观察者对象维护一个观察者列表,并在状态改变时触发`SubjectStateChanged`事件,通知所有订阅的观察者。例如:
```csharp
class Subject : ISubject
{
private List<Observer> observers = new List<Observer>();
// ...
public void NotifyObservers()
{
SubjectStateChanged?.Invoke();
}
// 添加/移除观察者
public void Subscribe(Observer observer)
{
observers.Add(observer);
}
public void Unsubscribe(Observer observer)
{
observers.Remove(observer);
}
}
```
5. 使用场景:
例如,在工作中,当老板回到办公室(主体)时,他可以调用`NotifyObservers()`,这样所有已订阅的员工(观察者)如看NBA直播的同事和看股票的同事都会收到通知,关闭他们的娱乐活动,进入工作状态。
通过C#观察者模式的实施,对象之间的依赖关系变得清晰且松耦合,当主体状态改变时,只需要维护好通知机制,就能确保所有相关观察者得到及时的更新。这在需要处理动态变化的系统中,如实时应用程序或事件驱动编程中,是非常有用的。
相关推荐



















weixin_38673235
- 粉丝: 3
最新资源
- Next.js入门教程:快速搭建开发环境
- EE信息博客:深入HTML技术要点解析
- MASTODON:地震分析与风险评估的MOOSE结构动力学应用
- Salesforce1 Mobile快速演示插件使用指南
- 多语言支持的Video Downloader Pro-crx插件
- 浏览器中直接运行PHP代码的Chrome扩展PHP Shell-crx
- Firefox扩展:JSON Viewer-crx插件解析语法突出显示
- 获取前20加密硬币交易信息的Crypto Price Ticker插件
- 企业商务单页办公网站模板设计
- RPA软件自动化工具:com.rpa.msghost-crx插件解析
- Flexpool非官方站点深度介绍与HTML技术解析
- WordPress PHP Docker容器映像稳定版与开发版介绍
- Elico Corporation维护的Odoo Docker映像使用指南
- LiveHosts-crx:Chrome扩展实现快速IP映射切换
- 使用tfgen进行网络设备与带宽压力测试
- NFT重印:永久免费的数字艺术品共享平台
- Roam Side-by-Side Pro插件功能介绍与支持版本
- ChromeOS上Yggdrasil网络的crx插件安装指南
- Avokadio演示项目:Firebase集成与Google登录教程
- Docker环境搭建指南:twmap基础配置
- Node.js自述文件生成器:快速创建专业README
- VidSaver:跨平台社交媒体视频下载器插件
- STKR: 贴纸搜索引擎Chrome扩展程序
- VIPtalk扩展实现WebRTC高清屏幕共享