千家信息网

Observer设计模式的示例分析

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章主要介绍了Observer设计模式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Observer设计模式说明假设我们
千家信息网最后更新 2025年11月07日Observer设计模式的示例分析

这篇文章主要介绍了Observer设计模式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

Observer设计模式说明

假设我们有个高档的热水器,我们给它通上电,当水温超过95度的时候:1、扬声器会开始发出语音,告诉你水的温度;2、液晶屏也会改变水温的显示,来提示水已经快烧开了。

现在我们需要写个程序来模拟这个烧水的过程,我们将定义一个类来代表热水器,我们管它叫:Heater,它有代表水温的字段,叫做temperature;当然,还有必不可少的给水加热方法BoilWater(),一个发出语音警报的方法MakeAlert(),一个显示水温的方法,ShowMsg()。

namespace Delegate {      class Heater {      private int temperature; // 水温      // 烧水      public void BoilWater() {          for (int i = 0; i < = 100; i++) {             temperature = i;              if (temperature > 95) {                 MakeAlert(temperature);                 ShowMsg(temperature);              }          }      }       // 发出语音警报      private void MakeAlert(int param) {         Console.WriteLine("Alarm:嘀嘀嘀,水已经 {0} 度了:" , param);      }            // 显示水温      private void ShowMsg(int param) {         Console.WriteLine("Display:水快开了,当前温度:{0}度。" , param);      }  }   class Program {      static void Main() {         Heater ht = new Heater();         ht.BoilWater();      }  }  }

Observer设计模式简介

上面的例子显然能完成我们之前描述的工作,但是却并不够好。现在假设热水器由三部分组成:热水器、警报器、显示器,它们来自于不同厂商并进行了组装。那么,应该是热水器仅仅负责烧水,它不能发出警报也不能显示水温;在水烧开时由警报器发出警报、显示器显示提示和水温。

这时候,上面的例子就应该变成这个样子:

// 热水器  public class Heater {       private int temperature;                // 烧水      private void BoilWater() {         for (int i = 0; i < = 100; i++) {             temperature = i;          }      }  }   // 警报器  public class Alarm{      private void MakeAlert(int param) {         Console.WriteLine("Alarm:嘀嘀嘀,水已经 {0} 度了:" , param);      }  }   // 显示器  public class Display{      private void ShowMsg(int param) {         Console.WriteLine("Display:水已烧开,当前温度:{0}度。" , param);      }  }

这里就出现了一个问题:如何在水烧开的时候通知报警器和显示器?在继续进行之前,我们先了解一下Observer设计模式,Observer设计模式中主要包括如下两类对象:

Subject:监视对象,它往往包含着其他对象所感兴趣的内容。在本范例中,热水器就是一个监视对象,它包含的其他对象所感兴趣的内容,就是temprature字段,当这个字段的值快到100时,会不断把数据发给监视它的对象。

Observer:监视者,它监视Subject,当Subject中的某件事发生的时候,会告知Observer,而Observer则会采取相应的行动。在本范例中,Observer有警报器和显示器,它们采取的行动分别是发出警报和显示水温。

在本例中,事情发生的顺序应该是这样的:

警报器和显示器告诉热水器,它对它的温度比较感兴趣(注册)。

热水器知道后保留对警报器和显示器的引用。

热水器进行烧水这一动作,当水温超过95度时,通过对警报器和显示器的引用,自动调用警报器的MakeAlert()方法、显示器的ShowMsg()方法。

类似这样的例子是很多的,GOF对它进行了抽象,称为Observer设计模式:Observer设计模式是为了定义对象间的一种一对多的依赖关系,以便于当一个对象的状态改变时,其他依赖于它的对象会被自动告知并更新。Observer模式是一种松耦合的设计模式。

实现范例的Observer设计模式

我们之前已经对委托和事件介绍很多了,现在写代码应该很容易了,现在在这里直接给出代码,并在注释中加以说明。

using System;  using System.Collections.Generic;  using System.Text;   namespace Delegate {      // 热水器      public class Heater {         private int temperature;         public delegate void BoilHandler(int param);   //声明委托         public event BoilHandler BoilEvent;        //声明事件          // 烧水         public void BoilWater() {             for (int i = 0; i < = 100; i++) {                temperature = i;                 if (temperature > 95) {                    if (BoilEvent != null) { //如果有对象注册                        BoilEvent(temperature);  //调用所有注册对象的方法                    }                }             }         }      }       // 警报器      public class Alarm {         public void MakeAlert(int param) {             Console.WriteLine("Alarm:嘀嘀嘀,水已经 {0} 度了:", param);         }      }       // 显示器      public class Display {         public static void ShowMsg(int param) { //静态方法             Console.WriteLine("Display:水快烧开了,当前温度:{0}度。", param);         }      }            class Program {         static void Main() {             Heater heater = new Heater();             Alarm alarm = new Alarm();              heater.BoilEvent += alarm.MakeAlert;    //注册方法             heater.BoilEvent += (new Alarm()).MakeAlert;   //给匿名对象注册方法             heater.BoilEvent += Display.ShowMsg;       //注册静态方法              heater.BoilWater();   //烧水,会自动调用注册过对象的方法         }      }  }

输出为:

Alarm:嘀嘀嘀,水已经 96 度了:  Alarm:嘀嘀嘀,水已经 96 度了:  Display:水快烧开了,当前温度:96度。  // 省略...

感谢你能够认真阅读完这篇文章,希望小编分享的"Observer设计模式的示例分析"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

警报 对象 模式 方法 热水 热水器 设计模式 设计 显示器 水温 警报器 温度 监视 兴趣 篇文章 例子 字段 时候 范例 语音 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 山东软件开发人日单价标准 重装数据库啥意思 科技互联网商标属于多少类 服务器cpu烧坏属于什么故障 领信互联网科技信息 山东综合软件开发均价 卫健委健康码软件开发商 部队网络安全承诺保证书模板 网络安全硬件因素 计算网络技术真的难就业吗 网络安全知识 小学 linux服务器申请清单 古墓丽影是用哪款软件开发的 如何自动登陆ftp服务器 山东最好服务器虚拟主机 mc服务器新手礼包制作 到底谁是网络安全老大 查询数据库表中数据的sql 亲朋无法登陆服务器 我的世界pvp练习服务器网易 云服务器还需要浏览器吗 山东综合软件开发均价 法雷奥软件开发待遇 世界智能科技与网络安全 oracle数据库部署详细流程 天谕官服服务器互通和 数据库中的亲属关系应该怎么筛选 it软件开发优选企业 软件开发过程中存在问题 微信会员软件开发源代码
0