一、观察者模式
定义了一种对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。常用于实现事件和通知系统。
二、代码
using System;
using System.Collections.Generic;
// 主题接口
public interface ISubject
{
void AddObserver(IObserver observer);
void RemoveObserver(IObserver observer);
void NotifyObservers(string news);
}
// 观察者接口
public interface IObserver
{
void Update(string news);
}
// 具体主题:新闻发布者
public class NewsPublisher : ISubject
{
private List<IObserver> _observers = new List<IObserver>();
private string _latestNews;
public void AddObserver(IObserver observer)
{
_observers.Add(observer);
}
public void RemoveObserver(IObserver observer)
{
_observers.Remove(observer);
}
public void NotifyObservers(string news)
{
_latestNews = news;
foreach (var observer in _observers)
{
observer.Update(_latestNews);
}
}
public void PublishNews(string news)
{
Console.WriteLine("Publishing news: " + news);
NotifyObservers(news);
}
}
// 具体观察者:订阅者
public class NewsSubscriber : IObserver
{
private string _name;
public NewsSubscriber(string name)
{
_name = name;
}
public void Update(string news)
{
Console.WriteLine(_name + " received news: " + news);
}
}
class Program
{
static void Main(string[] args)
{
// 创建新闻发布者和订阅者
NewsPublisher publisher = new NewsPublisher();
NewsSubscriber subscriber1 = new NewsSubscriber("Subscriber 1");
NewsSubscriber subscriber2 = new NewsSubscriber("Subscriber 2");
// 订阅者订阅发布者
publisher.AddObserver(subscriber1);
publisher.AddObserver(subscriber2);
// 发布新闻,订阅者将会收到通知
publisher.PublishNews("Important breaking news!");
// 移除一个订阅者
publisher.RemoveObserver(subscriber1);
// 发布新闻,只有一个订阅者将会收到通知
publisher.PublishNews("Another update!");
// 输出:
// Publishing news: Important breaking news!
// Subscriber 1 received news: Important breaking news!
// Subscriber 2 received news: Important breaking news!
// Publishing news: Another update!
// Subscriber 2 received news: Another update!
}
}
二、观察者模式与事件聚合器的区别
观察者模式:
- 观察者模式是一种对象间的一对多依赖关系,其中一个对象(主题)的状态发生改变时,所有依赖它的对象(观察者)都会收到通知并相应地更新自己的状态。
- 观察者模式通常由一个主题和多个观察者组成,主题维护观察者列表,并在状态变化时通知观察者。
- 观察者模式适用于需要实现对象之间松耦合的事件通知和数据更新场景,比如UI组件、事件系统等。
事件聚合器:
- 事件聚合器是一种用于集中管理和分发事件的机制。它允许多个部分或模块发布和订阅事件,以实现松耦合的通信,但与观察者模式相比,事件的发起者并不直接知道事件的订阅者。
- 事件聚合器将事件的发布和订阅从直接关系中解耦,使各个部分可以独立地发布和订阅事件,同时也提供了一种集中管理事件的机制。
- 事件聚合器适用于需要在不同组件、模块之间实现松耦合的事件通信,比如分布式系统、模块化应用等。
综上所述
观察者模式更侧重于对象间的状态变化通知,主题和观察者直接交互;而事件聚合器更侧重于分发事件、松耦合的事件通信,允许多个部分独立地发布和订阅事件,发起者和订阅者之间有一个中介机制。根据具体的应用场景和需求,选择合适的模式可以提高系统的可维护性和扩展性。
总结
观察者模式更侧重对象之间的状态变化,任何对象需要被通知都可以继承IObserver接口,并把对象添加到Publisher中,就会收到通知。