冯超

好好工作,天天向上

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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
posted on 2005-08-07 19:29  超哥  阅读(772)  评论(0编辑  收藏  举报