• C#设计模式---观察者模式(Observer Pattern)


    一、目的

    提供一种一对多的关系,当主题发生变化时候,可以通知所有关联的对象。

    二、定义

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

    三、场景

    假设多个用户订阅了微信中的汽车之家公众号,当公众号有新车到来的时候,则会通知所有订阅该公众号的用户,下面用观察者模式来模拟这一场景。

    四、实现

     1 using System;
     2 using System.Collections.Generic;
     3 
     4 namespace DesignMode_Observer
     5 {
     6     public interface IWechatAccountSubject
     7     {
     8         List<IObserver> ObserverList { get; set;}
     9         string SubjectName { get; set; }
    10         string Message { get; set; }
    11 
    12         void AddObserver(IObserver ob);
    13         void RemoveObserver(IObserver ob);
    14         void Notify();
    15 
    16         void AddNewMsg(string pMsg);
    17     }
    18     public interface IObserver
    19     {
    20         string ObservertName { get; set; }
    21         void ReceiveNewMessgage(IWechatAccountSubject subject);
    22     }
    23 
    24     public class Observer : IObserver
    25     {
    26         public string ObservertName { get; set; }
    27         public Observer(string pName)
    28         {
    29             this.ObservertName = pName;
    30         }
    31         public void ReceiveNewMessgage(IWechatAccountSubject subject)
    32         {
    33             Console.ForegroundColor = ConsoleColor.DarkGreen;
    34             Console.WriteLine($"{ObservertName} received msg from {subject.SubjectName}:
    {subject.Message}");
    35         }
    36     }
    37     public class WeChatCarAccountSubject:IWechatAccountSubject
    38     {
    39         public List<IObserver> ObserverList { get; set; }
    40         public string SubjectName { get; set; }
    41         public string Message { get; set; }
    42         public WeChatCarAccountSubject(string pSubjectName, string pMessage)
    43         {
    44             this.SubjectName = pSubjectName;
    45             this.Message = pMessage;
    46             ObserverList = new List<IObserver>();
    47         }
    48         public void AddObserver(IObserver ob)
    49         {
    50             ObserverList.Add(ob);
    51         }
    52         public void RemoveObserver(IObserver ob)
    53         {
    54             ObserverList.Remove(ob);
    55         }
    56 
    57         public void Notify()
    58         {
    59             foreach (var ob in ObserverList)
    60             {
    61                 if (ob != null)
    62                 {
    63                     ob.ReceiveNewMessgage(this);
    64                 }
    65             }
    66         }
    67 
    68         public void AddNewMsg(string pMsg)
    69         {
    70             Message += pMsg;
    71         }
    72     }
    73 
    74     class Program
    75     {
    76         static void Main(string[] args)
    77         {
    78             IObserver ob1 = new Observer("Mary");
    79             IObserver ob2 = new Observer("Jack");
    80             IWechatAccountSubject sub = new WeChatCarAccountSubject(nameof(WeChatCarAccountSubject), "New car Audi arrived
    ");
    81             sub.AddObserver(ob1);
    82             sub.AddObserver(ob2);
    83             sub.Notify();
    84 
    85             sub.AddNewMsg("New car Bmw arrived
    ");
    86 
    87             sub.Notify();
    88         }
    89     }
    90 }
    View Code

    运行结果如下:

    五、类图

     

    六、描述

    从上图可以看出,在观察者模式的结构图有以下角色:

    (1)抽象主题角色(Subject):抽象主题把所有观察者对象的引用保存在一个列表中,并提供增加和删除观察者对象的操作,抽象主题角色又叫做抽象被观察者角色,一般由抽象类

        或接口实现。

    (2)抽象观察者角色(Observer):为所有具体观察者定义一个接口,在得到主题通知时更新自己,一般由抽象类或接口实现。

    (3)具体主题角色(ConcreteSubject):实现抽象主题接口,具体主题角色又叫做具体被观察者角色。

    (4)具体观察者角色(ConcreteObserver):实现抽象观察者角色所要求的接口,以便使自身状态与主题的状态相协调。

  • 相关阅读:
    LeetCode 560 和为 K 的子数组
    idea使用技巧汇总
    【Kafka核心技术与实战】导读
    如何永久关闭 Mybase8 登录弹窗(license提醒)
    分析Edk2启动流程
    OEE计算
    线段树分治学习笔记
    linux 安装PostgreSql 12[转]
    Linux中redis数据备份和迁移【转】
    DataGrid控件自动显示行号
  • 原文地址:https://www.cnblogs.com/3xiaolonglong/p/9609453.html
Copyright © 2020-2023  润新知