zoukankan      html  css  js  c++  java
  • 设计模式——Observer模式

    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
  • 相关阅读:
    外键的创建
    MySQL (1366, "Incorrect string value: '\xF0\x9F\x8E\xAC\xE5\x89...' for column 'description' at row 1")
    python 获取文件路径
    ModuleNotFoundError: No module named 'Crypto'
    Django---错误
    CentOS7系统ifconfig无法使用的解决方法
    NACOS集群搭建遇到的问题
    Mysql连接报错:1130-host ... is not allowed to connect to this MySql server如何处理
    CentOS7 yum方式安装MySQL5.7
    MySQL数据库的全局锁和表锁
  • 原文地址:https://www.cnblogs.com/fengchao/p/209468.html
Copyright © 2011-2022 走看看