7 Observer模式
7.1 概述
Observer模式,就是建立一种机制,使多个对象依赖于某个特定对象,当这个特定的对象改变时,能通知到依赖它的所有对象作出反应。
7.2 设计
这里就有2个问题:一个是这个特定对象如何知道它要通知那些对象,二是如何通知?先来看第一问题:如何知道要通知那些对象?那么就需要对象在生成或需要被通知时,主动告诉这个特定的对象:我是你通知的对象。这个特定对象把它们都“记”起来,到时一个个通知。如何通知呢?就需要被通知的对象公布一个接口,这个特定对象调用这个接口,通知发生改变。但是如果有很多对象需要通知,每个对象各有一个接口,就会导致这个特定对象需要记住很多接口,特麻烦!好在它很聪明,让所有的对象统一接口,否则就不通知它。
7.3 实现
UML图:
示例代码为:
1
using System;
2
using System.Collections ;
3
4
namespace Example
5
{
6
/// <summary>
7
/// 示例
8
/// </summary>
9
class Example
10
{
11
/// <summary>
12
/// 应用程序的主入口点。
13
/// </summary>
14
[STAThread]
15
static void Main(string[] args)
16
{
17
Observer o1 = new O1() ;
18
Observer o2 = new O2() ;
19
20
Subject s = new Subject() ;
21
s.Notify() ;
22
}
23
/// <summary>
24
/// 被观察的对象
25
/// </summary>
26
public class Subject
27
{
28
/// <summary>
29
/// 静态数组保存观察者
30
/// </summary>
31
private static ArrayList list = new ArrayList() ;
32
/// <summary>
33
/// 把观察者加入到数组中
34
/// </summary>
35
/// <param name="o">被加入的观察者</param>
36
public static void Attach( Observer o )
37
{
38
list.Add( o ) ;
39
}
40
/// <summary>
41
/// 把观察者退出到数组中
42
/// </summary>
43
/// <param name="o">被退出的观察者</param>
44
public static void Detach( Observer o )
45
{
46
list.Remove( o ) ;
47
}
48
/// <summary>
49
/// 逐个通知发生改变
50
/// </summary>
51
public void Notify()
52
{
53
foreach( Observer o in list )
54
{
55
o.Update() ;
56
}
57
}
58
}
59
/// <summary>
60
/// 观察者
61
/// </summary>
62
public class Observer
63
{
64
public Observer()
65
{
66
Subject.Attach( this ) ;//在生成时加入观察者列
67
}
68
~Observer()
69
{
70
Subject.Detach( this ) ;//在注销时退出观察者列
71
}
72
public virtual void Update() {}//当观察的对象改变时
73
}
74
public class O1 : Observer
75
{
76
public override void Update()
77
{
78
Console.WriteLine( "O1 Update Now!" ) ;
79
}
80
}
81
public class O2 : Observer
82
{
83
public override void Update()
84
{
85
Console.WriteLine( "O2 Update Now!" ) ;
86
}
87
88
}
89
}
90
}
91

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

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91
