一、目的

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

二、定义

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

三、场景

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

四、实现

 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}:\n{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\n");
81 sub.AddObserver(ob1);
82 sub.AddObserver(ob2);
83 sub.Notify();
84
85 sub.AddNewMsg("New car Bmw arrived\n");
86
87 sub.Notify();
88 }
89 }
90 }

运行结果如下:

五、类图

六、描述

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

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

    或接口实现。

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

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

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

C#设计模式---观察者模式(Observer Pattern)的更多相关文章

  1. 设计模式-观察者模式(Observer Pattern)

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

  2. 设计模式 - 观察者模式(Observer Pattern) 详细说明

    观察者模式(Observer Pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...

  3. 设计模式 - 观察者模式(Observer Pattern) 详细解释

    观察者模式(Observer Pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...

  4. 设计模式 - 观察者模式(Observer Pattern) Java内置 用法

    观察者模式(Observer Pattern) Java内置 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659 ...

  5. C#设计模式——观察者模式(Observer Pattern)1

    一.概述在软件设计工作中会存在对象之间的依赖关系,当某一对象发生变化时,所有依赖它的对象都需要得到通知.如果设计的不好,很容易造成对象之间的耦合度太高,难以应对变化.使用观察者模式可以降低对象之间的依 ...

  6. C#设计模式——观察者模式(Observer Pattern)

    一.概述在软件设计工作中会存在对象之间的依赖关系,当某一对象发生变化时,所有依赖它的对象都需要得到通知.如果设计的不好,很容易造成对象之间的耦合度太高,难以应对变化.使用观察者模式可以降低对象之间的依 ...

  7. 23种设计模式--观察者模式-Observer Pattern

    一.观察者模式的介绍      观察者模式从字面的意思上理解,肯定有两个对象一个是观察者,另外一个是被观察者,观察者模式就是当被观察者发生改变得时候发送通知给观察者,当然这个观察者可以是多个对象,在项 ...

  8. 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)

    原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...

  9. 二十四种设计模式:观察者模式(Observer Pattern)

    观察者模式(Observer Pattern) 介绍定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新. 示例有一个Message实体类,某些对象 ...

  10. java设计模式--观察者模式(Observer)

    java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...

随机推荐

  1. C语言:变量定义

    变量定义:用于为变量分配存储空间,还可为变量指定初始值.程序中,变量有且仅有一个定义.变量声明:用于向程序表明变量的类型和名字.定义也是声明,extern声明不是定义 定义也是声明:当定义变量时我们声 ...

  2. 家庭账本开发day09

    编写数据表格的编辑操作,大体思路和删除操作一样 点击按钮,弹出修改项目,从父窗口获取已有的值赋给 弹出的子窗口中相应的值,在子窗口中点击提交,ajax请求 servlet修改.成功后重载表格,或者up ...

  3. RPC远程协议之原理分析

    在近几年工作中发现,功能服务化或微服务化越来越流行,逐渐成为实现中大型分布式系统架构的主要方式,而在分布式系统中的不同节点应用间的通信中,RPC远程协议扮演关键作用.实际上,在日常工作中,我们也多多少 ...

  4. StreamAPI

    一.简介 Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利.高效的聚合操作,或者大批量数据操作 . Stream API 借助于同样 ...

  5. pagehelper插件使用时查询不到数据

    刚用mybatis 的分页插件时,老项目中分页封装的分页类起始为( pageno-1)* pagesize  于是直直接在pagehelper.start(start,pagesize)来进行分页.结 ...

  6. 第二篇 -- Django写一个接口并用Jmeter进行测试

    第一节学习了Jmeter的下载和安装,那么第二节就来看看具体怎么使用. 本篇介绍的是使用Jmeter进行http接口测试,那么接口程序使用Django开发的一个小接口. 一.Django编写接口 这一 ...

  7. intouch制作历史报警查询(时间查询,筛选关键字)

    在项目中,intouch制作历史报警查询已属于标配功能,如何做出按时间以及关键字来进行综合查询,提高历史报警查询效率仍然是一个值得研究的问题,接下来参考网上文章自己总结下如何制作. 1.DTPicke ...

  8. 模式识别课程大作业 Shopee 商品图像检索

    大作业项目简介 在如今的信息科技时代, 带有拍照功能的移动设备如手机.相机等得到了极大的普及和流行, 各种各样的图片和视频可以随时随地获得, 并借助互联网快速传播, 这种趋势使得网络上的数字图片和视频 ...

  9. Nexus Repository Manager 3 远程命令执行漏洞(CVE-2020-10199、CVE-2020-10204)

    [影响版本] Nexus Repository Manager OSS/Pro 3.x <= 3.21.1 poc地址 https://github.com/magicming200/CVE-2 ...

  10. 远程访问Jupyter Notebook的两种方式:命令行和配置文件

    远程访问Jupyter Notebook的两种方式:命令行和配置文件 相关配置:Ubuntu 16.04服务器,本地Win10,使用了Xshell,Xftp工具. 相关配置主要分为三步: 服务器上的J ...