guachazhe_weituo.cs 2.3 KB

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