是什么:

观察者模式是一种设计模式,它定义了对象之间的一种一对多的依赖关系,使得当一个对象状态发生改变时,它的所有依赖者都能够得到相应的通知并作出相应的反应。观察者模式也被称为发布-订阅模式。

为什么:

观察者模式可以实现对象之间的松耦合,从而使得对象更容易扩展和维护。同时,它也可以帮助我们实现一些实时通信的需求,如事件驱动的程序等。

怎么做:

在C#中,可以通过接口和委托来实现观察者模式。具体的做法是,定义一个接口,包含一个Update()方法,表示观察者需要在被通知时执行的操作;然后,在被观察者对象中定义一个List<IObserver>类型的观察者列表,每个观察者对象实现IObserver接口中的Update()方法,被观察者对象可以通过遍历观察者列表,并依次调用Update()方法来通知所有观察者对象。

何时用:

观察者模式常用于以下场景:

1.在多个对象之间需要有一种一对多的依赖关系,并且不希望关键对象和被依赖对象之间存在强耦合关系。

2.需要实现实时通信,如事件驱动的程序等。

3.需要通知多个对象,但又不知道这些对象的确切数量和类型时。

4.需要将各个对象解耦开来,使得它们的改动不会影响到其他对象。

如何实现:

在C#中,使用观察者模式的关键是要定义一个接口,包含一个Update()方法。这个方法表示观察者需要在被通知时执行的操作。

接口代码示例:

//观察者接口
public interface IObserver
{
void Update();
}

然后,在被观察者对象中定义一个List<IObserver>类型的观察者列表,并提供添加删除观察者的方法。被观察者对象的代码示例:

//被观察者抽象类
public abstract class Subject
{
private List<IObserver> _observers = new List<IObserver>(); //添加观察者
public void Attach(IObserver observer)
{
_observers.Add(observer);
} //移除观察者
public void Detach(IObserver observer)
{
_observers.Remove(observer);
} //通知观察者
public void Notify()
{
foreach (var observer in _observers)
{
observer.Update();
}
}
}

在被观察者抽象类中,定义了一个观察者列表,以及添加、移除观察者和通知观察者列表中的观察者的方法。

最后,具体的观察者对象需要实现IObserver接口中的Update()方法,以便在被通知时能够执行相应的操作。观察者对象的代码示例:

//具体观察者类1
public class ConcreteObserverA : IObserver
{
public void Update()
{
Console.WriteLine("ConcreteObserverA received the message.");
}
} //具体观察者类2
public class ConcreteObserverB : IObserver
{
public void Update()
{
Console.WriteLine("ConcreteObserverB received the message.");
}
}

最后,我们可以在客户端中创建具体的被观察者对象和观察者对象,并将观察者对象添加到被观察者对象的观察者列表中,从而实现观察者模式的功能。

客户端代码示例:

class Client
{
static void Main(string[] args)
{
//创建被观察者对象
Subject subject = new ConcreteSubject(); //创建两个具体观察者对象并添加到被观察者对象的观察者列表中
IObserver observerA = new ConcreteObserverA();
IObserver observerB = new ConcreteObserverB(); subject.Attach(observerA);
subject.Attach(observerB); //被观察者对象的状态改变,通知观察者对象
subject.ChangeState();
subject.Notify();
}
}

输出结果:

```
The subject's state has been changed.
ConcreteObserverA received the message.
ConcreteObserverB received the message.
```

C#设计模式15——观察者模式的写法的更多相关文章

  1. c++设计模式15 --组合模式

    今天研究了一下设计模式15 组合模式 本人是菜鸟一枚,所以一开始完全不懂组合究竟是什么意思.先上图一张,树形结构图: 文档说,如果想做出这样的结构,通常考虑组合模式.那是为什么呢?现在让我们看一下组合 ...

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

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

  3. 设计模式之观察者模式(Observable与Observer)

    设计模式之观察者模式(Observable与Observer) 好久没有写博客啦,之前看完了<设计模式之禅>也没有总结一下,现在回忆一下设计模式之观察者模式. 1.什么是观察者模式 简单情 ...

  4. 8.5 GOF设计模式四: 观察者模式Observer

    GOF设计模式四: 观察者模式Observer  现实中遇到的问题  当有许多不同的客户都对同一数据源感兴趣,对相同的数据有不同的处理方式,该如 何解决?5.1 定义: 观察者模式  观察者模式 ...

  5. php 设计模式之观察者模式(订阅者模式)

    php 设计模式之观察者模式 实例 没用设计模式的代码,这样的代码要是把最上面那部分也要符合要求加进来,就要修改代码,不符合宁增不改的原则 介绍 观察者模式定义对象的一对多依赖,这样一来,当一个对象改 ...

  6. [JS设计模式]:观察者模式(即发布-订阅者模式)(4)

    简介 观察者模式又叫发布---订阅模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. 举一个现实生活中的例子,例如小 ...

  7. 实践GoF的23种设计模式:观察者模式

    摘要:当你需要监听某个状态的变更,且在状态变更时通知到监听者,用观察者模式吧. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:观察者模式>,作者: 元闰子 . 简介 现在有 ...

  8. 设计模式之 观察者模式详解(包含观察者模式JDK的漏洞以及事件驱动模型)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 本章我们讨论一个除前面的单例 ...

  9. java设计模式之观察者模式

    观察者模式 观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式.模型-视图(View)模式.源-收听者(Listener)模式或从属者模式)是软件设计模式的一种.在此种模 ...

  10. [python实现设计模式]-4.观察者模式-吃食啦!

    观察者模式是一个非常重要的设计模式. 我们先从一个故事引入. 工作日的每天5点左右,大燕同学都会给大家订饭. 然后7点左右,饭来了. 于是燕哥大吼一声,“饭来啦!”,5点钟定过饭的同学就会纷纷涌入餐厅 ...

随机推荐

  1. [NOI online2022普及B] 数学游戏

    题目描述 Kri 喜欢玩数字游戏. 一天,他在草稿纸上写下了 \(t\) 对正整数 \((x,y)\),并对于每一对正整数计算出了 \(z=x\times y\times\gcd(x,y)\). 可是 ...

  2. mybatis数据不匹配问题

    错误:数据不匹配的问题 原因:在初始化数据时.创建构造参数时只创建了全参,没有创建口参. 具体原因:因为mybatis框架会调用这个默认构造方法来构造实例对象.即Class类的newInstance方 ...

  3. zookeeper JavaApi 修改节点

    *修改数据 * 1.修改数据 * 2.根据版本修改 * * * */ @Test public void testSet() throws Exception{ Stat stat = new Sta ...

  4. 图片Base64相互转换

    一.简介 Base64编码是一种广泛应用于网络传输和数据存储的编码方式.在实际应用中,我们将图片转换为Base64编码,可以大大减少数据量,便于传输和存储.本文将详细介绍图片Base64编码的相互转换 ...

  5. LeetCode 503:下一个更大的元素|| (单调栈 or 线段树)

    解题思路: 1.单调栈:因为是循环数组,因此把数组复制三遍,ans 数组复制为2倍长,维护一个单调非递增的栈,栈保存的元素是元组(a[i] , i ),如果后面的值有比栈顶元素的值大,栈顶元素出栈,更 ...

  6. python生成列表的时间复杂度

    在刷题的时候,经常碰到需要生成非常大的邻接矩阵,往往我们都是用 list 存储,但是我在最近刷题的过程中就遇上了TLE的情况,原因就是生成邻接矩阵时间太花时间了. 先说结论:[ ]* n 比 [ fo ...

  7. 当一名阿里P9是什么样的体验?

    今天斗胆来跟大家分享一下作为一位阿里的P9是什么样的体验? 首先还是简单给大家介绍一下阿里的p9是属于一个什么样的层级?阿里p9中文名称叫做资深技术专家,一般大概带的团队有从几十人到一两百号人不等,具 ...

  8. 牛客网刷Java记录第一天

    第一题 下列程序输出啥? public class StringDemo{ private static final String MESSAGE="taobao"; public ...

  9. C语言之检验三边能否构成三角形

    要求: 编写程序检验由三边能否构成三角形,检验方法是任意两边和均要大于第三边. 输出格式:若结果可以构成,输出YES,否则输出ERROR DATA 其实很简单,运用与逻辑运算符&&判断 ...

  10. STM32CubeMX教程8 TIM 通用定时器 - 输出比较

    1.准备材料 开发板(STM32F407G-DISC1) ST-LINK/V2驱动 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) 逻 ...