观察者设计模式(Observer Design Pattern),又称为发布-订阅模式(Publish-Subscribe Pattern),是一种软件设计模式,使得多个对象(称为"观察者"或"订阅者")可以监听另一个对象(称为"主题"或"发布者")的状态变化。当主题对象的状态发生变化时,所有注册为观察者的对象都会得到通知并自动更新。
观察者模式的核心组件包括:
-
主题(Subject):
- 主题是被观察的对象,它维护了一系列观察者对象的引用,并提供接口供观察者注册(订阅)或注销(取消订阅)。
-
观察者(Observer):
- 观察者是监听主题的对象,它们实现了一个统一的接口,以便在主题状态更新时接收通知。
-
具体主题(Concrete Subject):
- 具体主题是主题的具体实现,它包含当前状态和所有观察者的引用,并负责在状态改变时通知观察者。
-
具体观察者(Concrete Observer):
- 具体观察者是观察者的具体实现,它们在接收到主题的通知时更新自己的状态。
观察者模式的主要优点包括:
-
解耦:主题和观察者之间的耦合度降低,因为主题通常不知道观察者的具体身份。
-
可扩展性:可以很容易地添加更多的观察者,而不需要修改主题的代码。
-
动态性 :观察者可以动态地订阅或取消订阅主题的通知。
观察者模式是行为设计模式之一,它定义了对象间的一种一对多的依赖关系,让一个对象的改变能够触发其他对象的改变。以下是使用C#实现观察者模式的一个实际例子:
假设我们有一个新闻发布系统,当发布新闻时,所有订阅者(观察者)都应该收到新闻通知。
定义观察者接口
cs
public interface IObserver
{
void Update(string news);
}
定义主题接口
cs
public interface ISubject
{
void Register(IObserver observer);
void Unregister(IObserver observer);
void Notify(string news);
}
具体主题
cs
public class NewsAgency : ISubject
{
private List<IObserver> observers = new List<IObserver>();
public void Register(IObserver observer)
{
if (!observers.Contains(observer))
{
observers.Add(observer);
}
}
public void Unregister(IObserver observer)
{
observers.Remove(observer);
}
public void Notify(string news)
{
foreach (var observer in observers)
{
observer.Update(news);
}
}
// 发布新闻的方法
public void ReleaseNews(string news)
{
Console.WriteLine("News has been released: " + news);
Notify(news);
}
}
具体观察者
cs
public class NewsSubscriber : IObserver
{
public void Update(string news)
{
Console.WriteLine("NewsSubscriber received news: " + news);
}
}
客户端代码
cs
class Program
{
static void Main(string[] args)
{
// 创建新闻发布机构
NewsAgency newsAgency = new NewsAgency();
// 创建订阅者
IObserver subscriber1 = new NewsSubscriber();
IObserver subscriber2 = new NewsSubscriber();
// 订阅新闻
newsAgency.Register(subscriber1);
newsAgency.Register(subscriber2);
// 发布新闻
newsAgency.ReleaseNews("New C# Features in 2024");
// 取消订阅
newsAgency.Unregister(subscriber1);
// 再次发布新闻,subscriber1 将不会收到通知
newsAgency.ReleaseNews("New Update on .NET 7 Performance");
}
}
在这个例子中,NewsAgency
是具体主题,它维护了一系列订阅者(观察者),并在发布新闻时通知他们。NewsSubscriber
是具体观察者,实现了 IObserver
接口,当接收到新闻时输出新闻内容。
客户端代码演示了如何创建主题和观察者,注册观察者,发布新闻,并取消订阅。当 NewsAgency
发布新闻时,所有注册的观察者都会收到通知并更新自己的状态(在这个例子中是输出新闻内容)。
观察者模式非常适合于实现消息发布和订阅系统、事件处理系统等场景,它有助于降低系统各部分之间的耦合度,提高代码的可维护性和可扩展性。