观察者模式

1.观察者模式是什么呢?

    观察者模式(有时又被称为发布-订阅Subscribe>模式、模型-视图View>模式、源-收听者Listener>模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实作事件处理系统。

  个人理解:观察者模式是一种思想,不需要人为的去关注观察者和被观察者之间是怎样联系的,实现了解耦,只需要对象去注册被观察者(Observerable)与观察者(Observer),然后被观察者去添加一个或者多个观察者,当被观察者发生变动就会立即通知所有的观察者。

下面我们来列举一个小例子:

比如猫来了,所有的老鼠都会跑,并会说XXX猫来了,快跑,我是XXX老鼠。

第一步:创建一个猫类

public class Cat //通知者 { public string Name{set;get;} //猫的名字 List<Rat> list=new List<Rat>(); //存储老鼠的集合

       //增加老鼠的方法    

     public void Add(Rat rat)      

      {            

       list.Add(rat);        

      }

        //删除老鼠的方法       

      public void Remove(Rat rat)     

      {            

        list.Remove(rat);     

      }

    public Cat(){}public Cat(string name){thisName=name;}//定义一个猫叫的方法public void Shout(){Console.WriteLine("喵喵喵!!!");//判断当集合不为空时if(list!=null){foreach(Rat item in list){itemRun();}}}}第二步:创建一个老鼠类

public class Rat { public string Name{ set; get;} //老鼠的名字 public Cat MyCat { set; get;}//数据类型是一个猫的变量 public Rat() { } public Rat(string name,Cat cat) { this.Name=name; this.MyCat=cat; } //定义一个老鼠跑的方法 public void Run() { Console.WriteLine(MyCat.Name+"猫来了,快跑!我是"+Name+"鼠"); } }

第三步:创建一个测试类

 class  Program{static void Main(string[] args){//先创建出一只猫Cat  cat=new Cat("Tom");//创建出第一只老鼠Rat rat1=new Rat("Jim",cat);Rat rat2=new Rat("TaoQi",cat);//把老鼠添加到集合中cat.Add(rat1);cat.Add(rat2);//调用猫叫的方法cat.Shout();Console.RadeKey();}}

运行结果:

 

这只是当有一个种类的观察者时,当我们有多个类的时候(比如:鸟,狗等等)我们就需要创建一个接口出来,创建它的实现类。

这个时候就需要我们把有共同行为的提炼到接口内

//1.创建一个接口

public  interface IRunable   //跑{void  Run();}

//2.创建一个抽象的Pet类

public  abstract class  Pet{public abstract void Shout(); //抽象叫的方法List<IRunable> list=new List<IRunable>();public void  Add(IRunable irunable){list.Add(irunable);}public  void Remove(IRunable irunable){list.Remove(irunable);}}   

//3.创建一个猫类的通知者

public class Cat:Pet
{public string Name{ set; get;} //猫的名字public Cat(){}public Cat(string name){this.Name=name;}public override void Shout(){ConsoleWriteLine("喵喵喵!!!");if(list!=null){ foreach(IRunable item in list){item.Run()}}}
}

//4.创建一个老鼠类的观察者

public class Rat:IRunable{public string Name{ set; get;} //老鼠的名字public Cat MyCat{ set; get;}  public Rat(){}public Rat(string name,Cat cat){this.Name=name;this.MyCat=cat;}public void Run(){Console.WriteLine(MyCat.Name+"猫来了,快跑!!我是老鼠"+Name);}}

//创建一个鸟类的观察者

public  calss Bird:IRunable{public string Name{ set; get;}  //鸟的名字public Cat MyCat{ set; get;}  public Bird(){}public Bird(string name,Cat cat){this.Name=name;this.MyCat=cat;}public void Run(){Console.WriteLine(MyCat.Name+"猫来了,快跑!!我是小鸟"+Name);}}

//6.创建测试类

class Program{static void Main(string[] args){//创建一只猫通知者Cat cat=new Cat("Tom");//创建一只老鼠的观察者Rat rat=new Rat("Jim",cat);//创建一只小鸟的观察者Bird bird=new Bird("DiDi",cat);//把观察者添加到集合中cat.Add(rat);cat.Add("bird");cat.Shout();Console.RaedKey();}

运行结果:

观察者模式的特点:
1.一个主题可以有任意数量依赖他的观察者,一旦主题的状态发生改变,所有观察者都可以得到通知
2.主题发出通知不需要知道具体观察者
3.具体观察者也不需要知道其他观察者的存在

但是:

将一个系统分割成一系列相互作用的类有一个很不好的副作用,就是需要维护相关对象间的一致性,

使得各个类紧密耦合,这样会给维护,扩展和重用都带来不便。

应用时机:

当一个对象的改变需要同时改变其他对象的时候使用观察模式 不知道具体有多少对象有待改变时,应考虑使用观察者模式 一个抽象模型有两个方面,其中一个方面依赖于另一个方面

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/187452.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2分图匹配算法

定义 节点u直接无边&#xff0c;v之间无边&#xff0c;边只存在uv之间。判断方法&#xff1a;BFS染色法&#xff0c;全部染色后&#xff0c;相邻边不同色 无权二部图中的最大匹配 最大匹配即每一个都匹配上min&#xff08;u&#xff0c; v&#xff09;。贪心算法可能导致&…

【Unity】Blender场景导入

素材 下载场景&#xff1a;https://www.aplaybox.com/details/model/keDSIks72Qh3 blender文件导出为.fbx文件&#xff0c;路径选择复制&#xff08;做的过程太乱了不知道有没有影响&#xff09;&#xff0c;物理类型选择网格&#xff0c;勾选应用变换 blender下的物体长度是u…

SS8813T 打印机驱动芯片

SS8813为打印机和其它电机一体化应用提供一种双通道集成电机驱动方案。SS8813有两路H桥驱动&#xff0c;每个H桥可提供最大峰值电流2.5A和均方根电流1.75A(在24V和Ta 25C适当散热条件下)&#xff0c;可驱动两个刷式直流电机&#xff0c;或者一个双极步进电机&#xff0c;或者螺…

Xilinx FPGA——ISE的UCF时序约束

时序约束是我们对FPGA设计的要求和期望&#xff0c;例如&#xff0c;我们希望FPGA设计可以工作在多快的时钟频率下等等。 设计是要求系统中的每一个时钟都进行时序约束。 一、分组约束语法&#xff08;NET、PIN、INST&#xff09; TNM是最基本的分组约束语法&#xff0c;其语法…

【小布_ORACLE笔记】Part11-5 RMAN Backups

【小布_ORACLE笔记】Part11-5 RMAN Backups 文章目录 【小布_ORACLE笔记】Part11-5 RMAN Backups1. 增量备份&#xff08;Incremental Backups)1.1差异增量备份&#xff08;Differential Incremental Backup&#xff09;1.2累积增量备份&#xff08;Cumulative Incremental Bac…

C#WPF本地化语言实例

本文演示C#WPF中使用.resx资源文件本地化语言实例 一、更改默认Resources.resx 文件 在解决方案资源管理器中,您将在“属性”文件夹下看到 Resources.resx 文件。将访问修饰符从内部更改为公共,以便可以在 XAML 文件中访问它。 二、创建新资源文件 默认情况下,程序使用默…

uniapp如何与原生应用进行混合开发?

目录 前言 1.集成Uniapp 2.与原生应用进行通信 3.实现原生功能 4.使用原生UI组件 结论: 前言 随着移动应用市场的不断发展&#xff0c;使用原生开发的应用已经不能满足用户的需求&#xff0c;而混合开发成为了越来越流行的选择。其中&#xff0c;Uniapp作为一种跨平台的开…

【开源视频联动物联网平台】写一个物联网项目捐献给Dromara组织

一、平台简介 MzMedia开源视频联动物联网平台&#xff0c;简单易用&#xff0c;更适合中小企业和个人学习使用。适用于智能家居、农业监测、水利监测、工业控制&#xff0c;车联网&#xff0c;监控直播&#xff0c;慢直播等场景。 支持抖音&#xff0c;视频号等主流短视频平台…

Linux 磁盘分区处理

最近实施过程中遇到客户提供给我们的服务器操作系统和Docke容器环境都已经安装完成&#xff0c;但磁盘的分区没有进行整理好。磁盘总共270G&#xff0c;系统安装分配了60G&#xff0c;剩余未创建分配需要处理。由于分区情况每家不一样&#xff0c;但大致流程都是相同的&#xf…

[论文阅读]VoxSet——Voxel Set Transformer

VoxSet Voxel Set Transformer: A Set-to-Set Approach to 3D Object Detection from Point Clouds 论文网址&#xff1a;VoxSet 论文代码&#xff1a;VoxSet 简读论文 这篇论文提出了一个称为Voxel Set Transformer(VoxSeT)的3D目标检测模型,主要有以下几个亮点: 提出了基于…

QML学习一、GridView的使用和增加添加动画、删除动画

一、效果预览 二、源码分享 import QtQuick import QtQuick.ControlsApplicationWindow {visible: truewidth: 640height: 480title: "Test"property int cnt:cnt model.countListModel{id:modelListElement{index:0}ListElement{index:1}ListElement{index:2}List…

Docker 使用心得

创建一个docker 镜像&#xff0c;相关运行代码&#xff0c;放在docker镜像文件同级&#xff0c; pm2 不能与 docker一起使用&#xff08;&#xff09; # node 服务docker FROM node:10.16.3LABEL author"sj"RUN mkdir -p /var/nodeCOPY ./node /var/nodeWORKDIR /va…

java_springboot企业人事考勤请假管理信息系统rsglxx+jsp

&#xff08;1&#xff09;熟练掌握Java开发的原理和方法 &#xff08;2&#xff09;熟练学习掌握SSM框架 &#xff08;3&#xff09;熟悉软件开发的流程 &#xff08;4&#xff09;了解中内外互联网中所主流的技术 &#xff08;5&#xff09;深层次的了解计算机学科领域的知识…

CCS中静态库lib的生成与调用

在调试DSP设备的时候&#xff0c;发现好多工程会把比较核心的代码生成静态库lib&#xff0c;代码运行的时候直接调用lib里面的相关函数就行。但是从外部是看不到lib库里面的内容的&#xff0c;这样通过静态库的方式实现对代码的加密。 在网上找了好久如何将函数生成静态库*.lib…

Mybatis 的简单运用介绍

Mybatis 用于操作数据库 操作数据库肯定需要: 1.SQL语句 2.数据库对象和 java 对象的映射 接下来我们看看怎么使用 Mybatis 我们先搞一些数据库内容 然后将其这些内容和Java对象进行映射 再创建一个类实现 select * from 再写一个类证明上述代码是否可以实现 别忘了在appli…

unity学习笔记13

一、常用物理关节 Unity中的物理关节&#xff08;Physics Joints&#xff09;是用于在游戏中模拟和控制物体之间的连接。物理关节允许你在对象之间应用各种约束&#xff0c;例如旋转、移动或固定连接&#xff0c;以模拟真实世界中的物理交互。 物理关节类型&#xff1a; 1.F…

C 语言-数组

1. 数组 1.1 引入 需求&#xff1a;记录班级10个学员的成绩 需要定义10个变量存在的问题:变量名起名困难变量管理困难需求&#xff1a;记录班级1000个学员的成绩 1.2 概念 作用&#xff1a;容纳 数据类型相同 的多个数据的容器 。 特点&#xff1a; 长度不可变容纳 数据类型…

Django 用户验证与权限管理详解

概要 Django是一款强大且灵活的Python Web框架&#xff0c;不仅在构建功能复杂的网站应用中表现出色&#xff0c;还在诸如用户验证、权限管理等细微之处提供了优秀的解决方案。在多用户、权限复杂的Web应用中&#xff0c;认证和权限管理尤其重要。接下来&#xff0c;我们就来探…

数据之美:数据可视化的力量与必要性

在当今信息爆炸的时代&#xff0c;数据量呈指数级增长&#xff0c;它们是我们日常生活和工作中的重要组成部分。然而&#xff0c;数据本身是无生命的数字和统计&#xff0c;若不能有效地被理解、传达和利用&#xff0c;其潜力就难以实现。这正是数据可视化变得越来越重要的原因…

深入了解Java8新特性-日期时间API之ChronoUnit、ChronoField

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概3000多字&#xff0c;预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&#x…