c# 观察者模式 实例
时间: 2023-09-24 21:13:15 浏览: 92
下面是一个 C# 的观察者模式实例:
```csharp
using System;
using System.Collections.Generic;
// 被观察者接口
interface ISubject
{
void Attach(IObserver observer); // 添加观察者
void Detach(IObserver observer); // 移除观察者
void Notify(); // 通知观察者
}
// 观察者接口
interface IObserver
{
void Update(ISubject subject); // 接收通知并更新
}
// 具体的被观察者类
class ConcreteSubject : ISubject
{
private List<IObserver> observers = new List<IObserver>();
private string state; // 被观察者状态
// 添加观察者
public void Attach(IObserver observer)
{
observers.Add(observer);
}
// 移除观察者
public void Detach(IObserver observer)
{
observers.Remove(observer);
}
// 通知观察者
public void Notify()
{
foreach (IObserver observer in observers)
{
observer.Update(this);
}
}
// 修改状态并通知观察者
public void SetState(string state)
{
this.state = state;
Notify();
}
public string GetState()
{
return state;
}
}
// 具体的观察者类
class ConcreteObserver : IObserver
{
private string name; // 观察者名称
public ConcreteObserver(string name)
{
this.name = name;
}
// 接收通知并更新
public void Update(ISubject subject)
{
Console.WriteLine("{0} 接收到了被观察者的通知,当前状态为 {1}", name, ((ConcreteSubject)subject).GetState());
}
}
// 测试代码
class Program
{
static void Main(string[] args)
{
ConcreteSubject subject = new ConcreteSubject();
// 添加观察者
subject.Attach(new ConcreteObserver("观察者 A"));
subject.Attach(new ConcreteObserver("观察者 B"));
subject.Attach(new ConcreteObserver("观察者 C"));
// 修改状态并通知观察者
subject.SetState("状态 1");
// 移除观察者
subject.Detach(new ConcreteObserver("观察者 B"));
// 修改状态并通知观察者
subject.SetState("状态 2");
Console.ReadKey();
}
}
```
以上代码实现了一个简单的观察者模式实例,其中 `ConcreteSubject` 是具体的被观察者类,实现了 `ISubject` 接口;`ConcreteObserver` 是具体的观察者类,实现了 `IObserver` 接口。在测试代码中,我们创建了一个 `ConcreteSubject` 对象,并添加了三个观察者,然后修改了状态并通知观察者,最后移除了一个观察者并再次修改状态并通知观察者。运行该程序,控制台输出如下:
```
观察者 A 接收到了被观察者的通知,当前状态为 状态 1
观察者 B 接收到了被观察者的通知,当前状态为 状态 1
观察者 C 接收到了被观察者的通知,当前状态为 状态 1
观察者 A 接收到了被观察者的通知,当前状态为 状态 2
观察者 C 接收到了被观察者的通知,当前状态为 状态 2
```
阅读全文