guachazhe_weituo.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace ConsoleApp
  7. {
  8. // 定义观察者接口
  9. public interface IObserver
  10. {
  11. void OnUpdate(string message);
  12. }
  13. // 主题类
  14. public class Subject
  15. {
  16. //观察者队列
  17. private List<IObserver> observers = new List<IObserver>();
  18. private string state;
  19. // 委托类型,用于表示通知方法
  20. public delegate void NotifyHandler(string message);
  21. public event NotifyHandler OnNotify;
  22. // 注册观察者
  23. public void RegisterObserver(IObserver observer)
  24. {
  25. observers.Add(observer);
  26. // 使用委托订阅事件(这一步是可选的,因为我们会直接调用OnNotify)
  27. // OnNotify += observer.OnUpdate; // 这种方式需要在注销时取消订阅
  28. }
  29. // 注销观察者
  30. public void UnregisterObserver(IObserver observer)
  31. {
  32. observers.Remove(observer);
  33. // 使用委托取消订阅事件(如果使用上面注释的代码)
  34. // OnNotify -= observer.OnUpdate;
  35. }
  36. // 通知所有观察者
  37. protected virtual void NotifyObservers()
  38. {
  39. string message = $"输出信息: {state}";
  40. // 使用事件通知(这种方式更符合事件的使用习惯)
  41. OnNotify?.Invoke(message);
  42. }
  43. // 设置状态并通知观察者
  44. public void SetState(string newState)
  45. {
  46. state = newState;
  47. NotifyObservers();
  48. }
  49. // 初始化事件(可选,可以在构造函数中做)
  50. public Subject()
  51. {
  52. //注册通知观察者的委托事件
  53. OnNotify += (message) => {
  54. foreach (var observer in observers)
  55. {
  56. //调用所有观察者的观察事件
  57. observer.OnUpdate(message);
  58. }
  59. };
  60. }
  61. }
  62. public class ConcreteObserverA : IObserver
  63. {
  64. public void OnUpdate(string message)
  65. {
  66. Console.WriteLine("观察者A输出: " + message);
  67. }
  68. }
  69. public class ConcreteObserverB : IObserver
  70. {
  71. public void OnUpdate(string message)
  72. {
  73. Console.WriteLine("观察者B输出: " + message);
  74. }
  75. }
  76. }