• 观察者模式


    观察者模式:

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

    一、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 }
    示例代码
  • 相关阅读:
    WCF 入门例子
    C#傻瓜日志类
    ajax长链接拉实现
    linux命令备忘
    .Net 并发异步处理总结
    grafana初始化密码(转载)
    Android 调用照相机拍照
    自定义android控件EditText 自定义边框 背景
    JSON 请求的实现过程
    [转]Android开发教程:shape和selector的结合使用
  • 原文地址:https://www.cnblogs.com/qiupiaohujie/p/11969892.html
Copyright © 2020-2023  润新知