7 Observer模式
7.1 概述
Observer模式,就是建立一种机制,使多个对象依赖于某个特定对象,当这个特定的对象改变时,能通知到依赖它的所有对象作出反应。
7.2 设计
这里就有2个问题:一个是这个特定对象如何知道它要通知那些对象,二是如何通知?先来看第一问题:如何知道要通知那些对象?那么就需要对象在生成或需要被通知时,主动告诉这个特定的对象:我是你通知的对象。这个特定对象把它们都“记”起来,到时一个个通知。如何通知呢?就需要被通知的对象公布一个接口,这个特定对象调用这个接口,通知发生改变。但是如果有很多对象需要通知,每个对象各有一个接口,就会导致这个特定对象需要记住很多接口,特麻烦!好在它很聪明,让所有的对象统一接口,否则就不通知它。
7.3 实现
UML图:
示例代码为:
1using System;
2using System.Collections ;
3
4namespace 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
2using System.Collections ;
3
4namespace 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