C#设计模式15——观察者模式的写法
是什么:
观察者模式是一种设计模式,它定义了对象之间的一种一对多的依赖关系,使得当一个对象状态发生改变时,它的所有依赖者都能够得到相应的通知并作出相应的反应。观察者模式也被称为发布-订阅模式。
为什么:
观察者模式可以实现对象之间的松耦合,从而使得对象更容易扩展和维护。同时,它也可以帮助我们实现一些实时通信的需求,如事件驱动的程序等。
怎么做:
在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——观察者模式的写法的更多相关文章
- c++设计模式15 --组合模式
今天研究了一下设计模式15 组合模式 本人是菜鸟一枚,所以一开始完全不懂组合究竟是什么意思.先上图一张,树形结构图: 文档说,如果想做出这样的结构,通常考虑组合模式.那是为什么呢?现在让我们看一下组合 ...
- 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)
原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...
- 设计模式之观察者模式(Observable与Observer)
设计模式之观察者模式(Observable与Observer) 好久没有写博客啦,之前看完了<设计模式之禅>也没有总结一下,现在回忆一下设计模式之观察者模式. 1.什么是观察者模式 简单情 ...
- 8.5 GOF设计模式四: 观察者模式Observer
GOF设计模式四: 观察者模式Observer 现实中遇到的问题 当有许多不同的客户都对同一数据源感兴趣,对相同的数据有不同的处理方式,该如 何解决?5.1 定义: 观察者模式 观察者模式 ...
- php 设计模式之观察者模式(订阅者模式)
php 设计模式之观察者模式 实例 没用设计模式的代码,这样的代码要是把最上面那部分也要符合要求加进来,就要修改代码,不符合宁增不改的原则 介绍 观察者模式定义对象的一对多依赖,这样一来,当一个对象改 ...
- [JS设计模式]:观察者模式(即发布-订阅者模式)(4)
简介 观察者模式又叫发布---订阅模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. 举一个现实生活中的例子,例如小 ...
- 实践GoF的23种设计模式:观察者模式
摘要:当你需要监听某个状态的变更,且在状态变更时通知到监听者,用观察者模式吧. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:观察者模式>,作者: 元闰子 . 简介 现在有 ...
- 设计模式之 观察者模式详解(包含观察者模式JDK的漏洞以及事件驱动模型)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 本章我们讨论一个除前面的单例 ...
- java设计模式之观察者模式
观察者模式 观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式.模型-视图(View)模式.源-收听者(Listener)模式或从属者模式)是软件设计模式的一种.在此种模 ...
- [python实现设计模式]-4.观察者模式-吃食啦!
观察者模式是一个非常重要的设计模式. 我们先从一个故事引入. 工作日的每天5点左右,大燕同学都会给大家订饭. 然后7点左右,饭来了. 于是燕哥大吼一声,“饭来啦!”,5点钟定过饭的同学就会纷纷涌入餐厅 ...
随机推荐
- SpringBoot内容协商机制
1.是什么? SpringBoot内容协商机制是一种实现了内容协商(Content Negotiation)的Web服务器,它可以根据客户端请求的不同,将响应返回给客户端. 在传统的Web服务器中,如 ...
- CentOS 7 安装 Python 3.X版本
由于Centos7默认安装了python2.7.5版本,因此想安装python 3.X版本就需要特殊处理. 详情可以参考南宫羽香的技术博客原文:https://www.cnblogs.com/lclq ...
- 查看电脑、手机中已保存的wifi密码
电脑: 以管理员身份运行CMD,执行 netsh wlan show profile netsh wlan export profile folder=C:\ key=clear 此时,用记事本打开对 ...
- P4928 [MtOI2018]衣服?身外之物! 题解
题意 gcd 共有 \(n\) 件衣服,编号为 \(A_1,A_2,\cdots A_n\). 每一件衣服分别拥有颜色值和清洗时间,他在每一件衣服穿完以后都会将其送去清洗,而这件衣服当天所拥有的舒适感 ...
- Flume快速入门
Flume快速入门 一.简介 高可用.高可靠,分布式的海量日志采集.聚合和传输系统,基于流式架构,灵活简单. event:事件 source:数据源 sink:目标 channel:数据管道 通过获取 ...
- 一图看懂CodeArts Inspector 三大特性,带你玩转漏洞管理服务
本文分享自华为云开发者联盟公众号<一图看懂华为云CodeArts Inspector三大特性,带你玩转漏洞管理服务>. 华为云漏洞管理服务CodeArts Inspector是面向 ...
- 物联网常见协议之Amqp协议及使用场景解析
摘要:本文围绕AMQP协议,为大家详细解析AMQP协议.核心技术亮点.多协议之间的对比以及使用实践. 本文分享自华为云社区<物联网常见协议之Amqp协议及使用场景解析>,作者:张俭. 引言 ...
- 对话 BitSail Contributor | 吴畅:从好奇,到深入
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 2022 年 10 月,字节跳动 BitSail 数据引擎正式开源.同期,社区推出 Contributor 激励计 ...
- SpringBoot Docker 发布到 阿里仓库
1. 创建仓库 管理里面,可以查看详细的信息 设置登录密码 2. 接下来,将本地镜像推到阿里 : SpringBoot Docker 发布 docker commit 这部分可以不操作 docker ...
- Open vSwitch系列之十 调用北向接口下发流表
Open vSwitch系列之一 Open vSwitch诞生 Open vSwitch系列之二 安装指定版本ovs Open vSwitch系列之三 ovs-vsctl命令使用 Open vSwit ...