【C#设计模式(20)——观察者模式(Observer Pattern)】

news/2024/12/15 12:34:12/

前言

观察者模式

观察者模式:定义了一种对象之间的一对多依赖关系,消息发布者发布通知时,它的所有订阅者(依赖)对象都会自动收到通知并进行相应的更新。

代码

//抽象观察者类
public abstract class Observer
{protected string name;public string Name { get { return name; } }public Observer(string name){this.name = name;}public abstract void Update(string message);
}//具体观察者类1:主题订阅类
public class SubscribeSubject : Observer
{public SubscribeSubject(string name) : base(name){}public override void Update(string message){Console.WriteLine($"[{name}] received a subject message : {message}");}
}
//具体观察者类2:消息订阅类
public class MessageReceiver : Observer
{public MessageReceiver(string name) : base(name){}public override void Update(string message){Console.WriteLine($"[{name}] received a subject message : {message}");}
}//(抽象)主题接口
public interface Subject
{void Attch(Observer observer);void Detach(Observer observer);void NotifyObservers(string message);
}
//具体主题:发布主题类
public class PublishSubject : Subject
{public List<Observer> Observers = new List<Observer>();public void Attch(Observer observer){Observers.Add(observer);Console.WriteLine($"Add an subscriber[type={observer.GetType().Name}],[ name = {observer.Name}]");}public void Detach(Observer observer){Observers.Remove(observer);Console.WriteLine($"Removes an subscriber: {observer.Name}");}public void NotifyObservers(string message){Console.WriteLine($"publish a notify:{message}");foreach (var item in Observers){item.Update(message);}}
}/** 行为型模式:Behavioral Pattern* 观察者模式:Observer Pattern*/
internal class Program
{static void Main(string[] args){//创建观察者Observer observer1 = new SubscribeSubject("User1");Observer observer2 = new SubscribeSubject("User2");Observer observer3 = new SubscribeSubject("User3");Observer observer4 = new SubscribeSubject("User4");Observer observer5 = new MessageReceiver("User5");//创建发布者Subject pubulisher = new PublishSubject();//发布者记录观察者pubulisher.Attch(observer1);pubulisher.Attch(observer2);pubulisher.Attch(observer3);pubulisher.Attch(observer4);pubulisher.Attch(observer5);//发布消息Console.WriteLine();pubulisher.NotifyObservers("Hellow users.");Console.WriteLine();pubulisher.Detach(observer1);Console.WriteLine();pubulisher.NotifyObservers("see you again,users!");Console.ReadLine();}
}

运行结果

在这里插入图片描述


http://www.ppmy.cn/news/1555291.html

相关文章

Java 小抄|解析 JSON 并提取特定层级数据

文章目录 前言环境准备依赖库 示例代码JSON 数据Java 类定义解析 JSON 数据代码解释 结论 前言 在日常开发中&#xff0c;我们经常需要从 JSON 数据中提取特定的信息。本文将介绍如何使用 Java 和 Gson 库解析 JSON 数据&#xff0c;并通过流式处理提取特定层级的数据。我们将…

有效的括号(字节面试题 最优解)

题目来源 20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号…

Qt之网络监测

在Qt中&#xff0c;网络监测通常涉及到检测网络连接状态、网络延迟、带宽使用情况等。Qt提供了一些类和模块来帮助开发者实现这些功能。以下是一些常用的方法和类&#xff1a; 1. 检测网络连接状态 QtNetwork模块中的QNetworkConfigurationManager类可以用来检测设备的网络连…

ConfyUI(sd-webui)-aki-v4.9.1升级安装Torch 2.5.1-CUDA12.4【含安装包】

总结&#xff1a; 原地升级操作三步走【要有一个能正常运行的aki-v4.9.1&#xff0c;先压缩备份它】&#xff1a; 一、在绘世-高级选项-安装PyTorch时&#xff0c;找到接近并且低于N卡CUDA驱动版本的版本&#xff0c;显示安装成功&#xff1b; 二、重启绘世-高级选项-原生组件…

将PDF流使用 canvas 绘制然后转为图片展示在页面上(二)

将PDF流转为图片展示在页面上 使用 pdfjs-dist 库来渲染 PDF 页面到 canvas 上&#xff0c;然后将 canvas 转为图片 安装 pdfjs-dist 依赖 npm install pdfjs-dist 或者 yarn add pdfjs-dist创建一个组件来处理 PDF 流的加载和渲染 该组件中是一个包含 PDF 文件的 ArrayBuffer…

OGG FOR MYSQL同步DDL

以下实验测试OGG FOR mysql 同步DDL&#xff0c; OGG 21.3 MYSQL 8.0.27 --创建测试数据 create table oggddl_20241201 (oid int primary key ,oname varchar(10)); create table oggddl_20241202 (oid int primary key ,oname varchar(10)); create table oggddl_20241203…

php仿199万年历程序源码的实现方法和成品黄历站展示

以下是一个简单的方案&#xff0c;包含了前端设计思路、后端逻辑和黄历计算的基本实现。 设计方案 1. 项目架构 核心文件: Calendar.php: 封装黄历计算逻辑。index.php: 入口文件&#xff0c;处理用户输入并调用黄历类。 2. 黄历类设计 (Calendar.php) 属性: date: 存储用户…

ubuntu 用 ss-tproxy的最终网络结构

1、包含了AD广告域名筛选 2、Ss-tproxy 国内国外地址分类 3、chinadns-ng解析 4、透明网关 更多细节看之前博客 ubuntu 用ss-TPROXY实现透明代理&#xff0c;基于TPROXY的透明TCP/UDP代理,在 Linux 2.6.28 后进入官方内核。ubuntu 用 ss-tproxy的内置 DNS 前挂上 AdGuardHome…