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
using System;2
using System.Collections ;3

4
namespace Example5
{6
/// <summary>7
/// 示例8
/// </summary>9
class Example10
{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 Subject27
{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 Observer63
{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 : Observer75
{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




浙公网安备 33010602011771号