C#观察者模式详解:实时通知与应用实例
79 浏览量
更新于2024-08-30
收藏 85KB PDF 举报
"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#观察者模式的实施,对象之间的依赖关系变得清晰且松耦合,当主体状态改变时,只需要维护好通知机制,就能确保所有相关观察者得到及时的更新。这在需要处理动态变化的系统中,如实时应用程序或事件驱动编程中,是非常有用的。
2018-10-15 上传
2023-05-12 上传
2009-11-09 上传
2020-09-04 上传
2020-12-31 上传
2016-06-26 上传
2014-01-09 上传
2014-07-27 上传
weixin_38673235
- 粉丝: 3
- 资源: 912
最新资源
- Python中快速友好的MessagePack序列化库msgspec
- 大学生社团管理系统设计与实现
- 基于Netbeans和JavaFX的宿舍管理系统开发与实践
- NodeJS打造Discord机器人:kazzcord功能全解析
- 小学教学与管理一体化:校务管理系统v***
- AppDeploy neXtGen:无需代理的Windows AD集成软件自动分发
- 基于SSM和JSP技术的网上商城系统开发
- 探索ANOIRA16的GitHub托管测试网站之路
- 语音性别识别:机器学习模型的精确度提升策略
- 利用MATLAB代码让古董486电脑焕发新生
- Erlang VM上的分布式生命游戏实现与Elixir设计
- 一键下载管理 - Go to Downloads-crx插件
- Java SSM框架开发的客户关系管理系统
- 使用SQL数据库和Django开发应用程序指南
- Spring Security实战指南:详细示例与应用
- Quarkus项目测试展示柜:Cucumber与FitNesse实践