zoukankan      html  css  js  c++  java
  • 观察者模式

    观察者模式:

    定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主体对象。这个主体对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己状态。

    一、UML结构图

    二、示例代码

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 
      6 /*
      7  * 
      8  */
      9 namespace 观察者模式
     10 {
     11     class Program
     12     {
     13         static void Main(string[] args)
     14         {
     15 
     16             Subject sb = new Subject();
     17             IObserver ob1 = new ConcreteObserver("张三",sb);
     18             sb.AddObserver(ob1);
     19 
     20             IObserver ob2 = new ConcreteObserver("李四",sb);
     21             sb.AddObserver(ob2);
     22 
     23             Console.WriteLine("被观察者状态变化:");
     24             sb.SubjectState = "我回来了";
     25             sb.Notify();
     26 
     27             Console.Read();
     28 
     29         }
     30     }
     31 
     32     #region 观察者 和 通知者 基类
     33     /// <summary>
     34     /// 主体通知者
     35     /// </summary>
     36     public abstract class SubejectNotify
     37     {
     38 
     39         //需要通知的观者者集合
     40         private List<IObserver> m_lstObserver = new List<IObserver>();
     41         //增加观察者
     42         public void AddObserver(IObserver ob)
     43         {
     44             if (ob != null)
     45                 m_lstObserver.Add(ob);
     46         }
     47         //移出观察者
     48         public void RemoveObserver(IObserver ob)
     49         {
     50             if (ob != null && m_lstObserver.Contains(ob))            
     51                 m_lstObserver.Remove(ob);            
     52         }
     53 
     54         //通知
     55         public void Notify()
     56         {
     57             foreach (IObserver ob in m_lstObserver)
     58                 ob.UpdateSelfState();
     59         }
     60 
     61     }
     62 
     63     /// <summary>
     64     /// 观察者
     65     /// </summary>
     66     public interface IObserver
     67     {
     68         /// <summary>
     69         /// 更新观察者自身状态
     70         /// </summary>
     71         void UpdateSelfState();
     72     }
     73 
     74     
     75     #endregion
     76 
     77     #region 被观者者
     78     /// <summary>
     79     /// 被观察者,继承SubjectNotify,已被监听
     80     /// </summary>
     81     public class Subject : SubejectNotify
     82     {
     83         private string m_State;
     84         public string SubjectState
     85         {
     86             get { return m_State; }
     87             set { m_State = value;
     88             Console.WriteLine(value);
     89             }
     90         }
     91     }
     92 
     93     /// <summary>
     94     /// 具体的观察者,具备Update方法,当观察到 被观察者 状态发生变化时,更新自己状态
     95     /// </summary>
     96     public class ConcreteObserver:IObserver
     97     {
     98         private string m_Name;
     99 
    100         //引用具体的被观察对象,目的是获取被观察 变化的状态信息
    101         private Subject m_Subject;
    102         public ConcreteObserver(string name,Subject sub)
    103         {
    104             m_Name = name;
    105             m_Subject = sub;
    106         }
    107 
    108         public void UpdateSelfState()
    109         {
    110             Console.WriteLine(string.Format("{0}:我已经收到被观察者状态变化:{1}", m_Name,m_Subject.SubjectState));
    111         }
    112     }
    113     #endregion
    114     
    115 }
    示例代码
  • 相关阅读:
    敏捷开发中的故事点到底是什么?如何预估故事点?
    Worktile 进军软件开发与协作的初心与野心
    宽带无法登陆GitHub解决——修改host
    IDEA自定义类注释和方法注释(自定义groovyScript方法实现多行参数注释)
    SpringBoot2.x整合redis和使用redis缓存
    简单聊聊JVM
    IDEA打包web项目为war,通过本地Tomcat启动war
    多表更新
    unittest suite集合实现原理
    14.0 native webview H5切换
  • 原文地址:https://www.cnblogs.com/qiupiaohujie/p/11969892.html
Copyright © 2011-2022 走看看