观察者模式(ObserverPattern)

ops/2024/9/24 21:23:56/

文章目录

1.观察者模式定义

定义一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象
杂志和报纸订阅
如果你订阅了一份杂志或报纸, 那就不需要再去报摊查询新出版的刊物了。 出版社 (即应用中的 “发布者”) 会在刊物出版后 (甚至提前) 直接将最新一期寄送至你的邮箱中。
出版社负责维护订阅者列表, 了解订阅者对哪些刊物感兴趣。 当订阅者希望出版社停止寄送新一期的杂志时, 他们可随时从该列表中退出。

2.UML类图

在这里插入图片描述

3.实现代码

观察者:

// 观察者接口
public interface IObserver
{void Update(ISubject subject);
}// 具体观察者A
public class ObserverA : IObserver
{public void Update(ISubject subject){Console.WriteLine(string.Format("ObserverA observe Subject change:StateNum={0}", (subject as Subject).StateNum));}
}// 具体观察者B
public class ObserverB : IObserver
{public void Update(ISubject subject){Console.WriteLine(string.Format("ObserverB observe Subject change:StateNum={0}", (subject as Subject).StateNum));}
}

被观察者:

// 被观察者接口
public interface ISubject
{// 订阅void Subscribe(IObserver observer);// 取消订阅void Unsubscribe(IObserver IObserver);// 广播void Notify();
}// 具体被观察者
public class Subject : ISubject
{// 状态数字public int StateNum{get; set;}private List<IObserver> _observables = new List<IObserver>();public void Notify(){StateNum = new Random().Next(0, 10);Console.WriteLine(string.Format("StateNum Change:StateNum={0}", StateNum));foreach (var observer in _observables){observer.Update(this);}}public void Subscribe(IObserver observer){_observables.Add(observer);}public void Unsubscribe(IObserver observer){_observables.Remove(observer);}
}

使用:

Subject subject = new Subject();
var observeA = new ObserverA();
var observeB = new ObserverB();subject.Subscribe(observeA);
subject.Subscribe(observeB);
subject.Notify();subject.Unsubscribe(observeA);
subject.Notify();

StateNum Change:StateNum=2
ObserverA observe Subject change:StateNum=2
ObserverB observe Subject change:StateNum=2
StateNum Change:StateNum=5
ObserverB observe Subject change:StateNum=5


http://www.ppmy.cn/ops/94893.html

相关文章

【数据结构】算法复杂度

目录 正文开始 1. 数据结构前⾔ 1.1 数据结构 数据结构(Data Structure)是计算机存储、组织数据的⽅式&#xff0c;指相互之间存在⼀种或多种特定关系的数据元素的集合。没有⼀种单⼀的数据结构对所有⽤途都有⽤&#xff0c;所以我们要学各式各样的数据结构&#xff0c; 如&a…

cv::normalize()

cv::normalize()函数是OpenCV库中用于对矩阵或图像数据进行归一化处理的工具。归一化是图像处理和计算机视觉中常见的预处理步骤&#xff0c;它可以确保数据在一定范围内&#xff0c;从而有助于后续的处理和算法的稳定性和性能。cv::normalize()函数可以将输入矩阵的值缩放到一…

[鸿蒙笔记-基础篇_TS语法] Harmony OS

前言:看过的一款黑马的鸿蒙开发视频&#xff0c;讲的不错&#xff0c;有些官方文档也没有细说&#xff0c;整理一些截图方便后续查找和面试复习。 1、数据类型 2、条件语句 3、循环语句 4、函数类型 5、面向对象 6、TS类、函数导入和导出使用方法 后续再做补充

希尔排序,详细解析(附图解)

1.希尔排序思路 希尔排序是一种基于插入排序的算法&#xff0c;通过将原始数据分成若干个子序列&#xff0c;然后对子序列进行插入排序&#xff0c;逐渐减小子序列的间隔&#xff0c;最后对整个序列进行一次插入排序。 1.分组直接插入排序&#xff0c;目标接近有序--------…

龙智Atlassian解决方案实践案例:集成Jira、Confluence、JSM,助力某汽车行业客户实现高效项目管理

客户简介 所属行业&#xff1a;汽车智能网联 用户数&#xff1a;约250人 使用产品/服务&#xff1a;Jira、Confluence、Jira Service Management &#xff08;JSM&#xff09; 解决方案提供商/合作伙伴&#xff1a;龙智 案例背景 该客户专注于车联网系统的研发&#xff0…

无字母数字webshell命令执行

<?php if(isset($_GET[code])){$code $_GET[code];if(strlen($code)>35){die("Long.");}if(preg_match("/[A-Za-z0-9_$]/",$code)){die("NO.");}eval($code); }else{highlight_file(__FILE__); }限制&#xff1a; 1.webshell长度不超过…

安卓相关环境配置

安卓相关环境配置 偶尔更新。。。 JEB&#xff08;动态调试好用&#xff09; JEB动态调试Smali-真机/模拟器&#xff08;详细&#xff0c;新手必看&#xff09; 夜步城 JADX官网&#xff08;静态分析&#xff09; https://github.com/skylot/jadx/releases/tag/v1.5.0 雷…

LVS--理论+实操

lvs简介 LVS:Linux Virtual Server&#xff0c;负载调度器&#xff0c;内核集成&#xff0c;章文嵩&#xff0c;阿里的四SLB(Server LoadBalance)是基 于LVSkeepalived实现 lvs集群体系结构 工作原理&#xff1a; VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS…