123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace ConsoleApp
- {
- // 定义观察者接口
- public interface IObserver
- {
- void OnUpdate(string message);
- }
- // 主题类
- public class Subject
- {
- //观察者队列
- private List<IObserver> observers = new List<IObserver>();
- private string state;
- // 委托类型,用于表示通知方法
- public delegate void NotifyHandler(string message);
- public event NotifyHandler OnNotify;
- // 注册观察者
- public void RegisterObserver(IObserver observer)
- {
- observers.Add(observer);
- // 使用委托订阅事件(这一步是可选的,因为我们会直接调用OnNotify)
- // OnNotify += observer.OnUpdate; // 这种方式需要在注销时取消订阅
- }
- // 注销观察者
- public void UnregisterObserver(IObserver observer)
- {
- observers.Remove(observer);
- // 使用委托取消订阅事件(如果使用上面注释的代码)
- // OnNotify -= observer.OnUpdate;
- }
- // 通知所有观察者
- protected virtual void NotifyObservers()
- {
- string message = $"输出信息: {state}";
- // 使用事件通知(这种方式更符合事件的使用习惯)
- OnNotify?.Invoke(message);
- }
- // 设置状态并通知观察者
- public void SetState(string newState)
- {
- state = newState;
- NotifyObservers();
- }
- // 初始化事件(可选,可以在构造函数中做)
- public Subject()
- {
- //注册通知观察者的委托事件
- OnNotify += (message) => {
- foreach (var observer in observers)
- {
- //调用所有观察者的观察事件
- observer.OnUpdate(message);
- }
- };
- }
- }
- public class ConcreteObserverA : IObserver
- {
- public void OnUpdate(string message)
- {
- Console.WriteLine("观察者A输出: " + message);
- }
- }
- public class ConcreteObserverB : IObserver
- {
- public void OnUpdate(string message)
- {
- Console.WriteLine("观察者B输出: " + message);
- }
- }
- }
|