C#中的观察者模式

观察者模式

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
///<观察者模式>
//1. 定义观察者接口
public interface IObserver
{
void Update(string message);
}
//2. 定义主题(被观察者)接口
public interface ISubject
{
void RegisterObserver(IObserver observer);
void RemoveObserver(IObserver observer);
void Notify();
}
//3. 定义具体主题(被观察者)
public class Subject : ISubject
{
private List<IObserver> _observers = new List<IObserver>();
private string _state { get ; set; }
public string SetState
{
get { return _state; }
set
{
_state = value;
Notify();
}
}
public void RegisterObserver(IObserver observer)
{
_observers.Add(observer);
}
public void RemoveObserver(IObserver observer)
{
_observers.Remove(observer);
}
public void Notify()
{
foreach (var observer in _observers)
{
observer.Update(_state);
}
}
}
//4. 定义具体观察者
public class Observer : IObserver
{
private string _name;
public Observer(string name)
{
_name = name;
}
public string GetName()
{
return _name;
}
public void Update(string message)
{
Console.WriteLine($"Observer{_name} received message: {message}");
}
}
///<观察者模式/>

执行流程:

1
2
3
4
5
6
7
8
9
10
Subject subject = new Subject();
IObserver observer1 = new Observer("100");
IObserver observer2 = new Observer("101");

subject.RegisterObserver(observer1);
subject.RegisterObserver(observer2);

subject.SetState = "New message"; // 自动通知所有观察者
subject.RemoveObserver(observer1);
subject.SetState = "Another message"; // 仅通知observer2

模式要点

  1. 主题(Subject)

    • 维护观察者列表

    • 状态变更时自动通知

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//设置状态调用Notify()方法
public string SetState
{
get { return _state; }
set
{
_state = value;
Notify();
}
}
//更新观察者列表中所有观察者的状态
public void Notify()
{
foreach (var observer in _observers)
{
observer.Update(_state);
}
}
  1. 观察者(Observer)

    • 实现Update()方法

    • 接收主题通知

  2. 接口分离

    • ISubject定义管理观察者的方法

    • IObserver定义更新接口

优势

  • 主题和观察者松耦合

  • 支持动态添加/移除观察者

  • 状态变更自动传播

适用场景

  • 事件通知系统

  • 数据监控

  • GUI事件处理

  • 实时数据更新

完整代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
///<观察者模式>
public interface IObserver
{
void Update(string message);
}
public interface ISubject
{
void RegisterObserver(IObserver observer);
void RemoveObserver(IObserver observer);
void Notify();
}
public class Subject : ISubject
{
private List<IObserver> _observers = new List<IObserver>();
private string _state { get ; set; }
public string SetState
{
get { return _state; }
set
{
_state = value;
Notify();
}
}
public void RegisterObserver(IObserver observer)
{
_observers.Add(observer);
}
public void RemoveObserver(IObserver observer)
{
_observers.Remove(observer);
}
public void Notify()
{
foreach (var observer in _observers)
{
observer.Update(_state);
}
}
}
public class Observer : IObserver
{
private string _name;
public Observer(string name)
{
_name = name;
}
public string GetName()
{
return _name;
}
public void Update(string message)
{
Console.WriteLine($"Observer{_name} received message: {message}");
}
}
///<观察者模式/>

public class Program
{
public static void Main(string[] args)
{
///<观察者模式>
Console.WriteLine();
Console.WriteLine("观察者模式:");
Subject subject = new Subject();
IObserver observer1 = new Observer("100");
IObserver observer2 = new Observer("101");
subject.RegisterObserver(observer1);
subject.RegisterObserver(observer2);
subject.SetState = "New message";
subject.RemoveObserver(observer1);
subject.SetState = "Another message";
///<观察者模式/>
}
}