赤壁之战的烽火台 - 观察者模式

“当烽火连三月,家书抵万金;设计模式得其法,千军如一心。”

在波澜壮阔的三国历史长河中,赤壁之战无疑是一场改变乾坤的重要战役。而在这场战役中,一个看似简单却至关重要的系统发挥了巨大作用——烽火台。这个古老的通讯系统,是否让你联想到了现代软件设计中的观察者模式?今天,让我们穿越千年,从烽火台的烟雾中,揭开观察者模式的神秘面纱。

赤壁江畔战云起,
烽火一燃天下知。
观察变化随机应,
一招制敌保江山。

烽火连天

公元 208 年,曹操率领大军南下,意图一举荡平江东,统一天下。面对来势汹汹的曹军,孙刘联军不得不精心谋划,以弱胜强。

"若要及时应对曹军的动向,必须构建一个高效的预警系统。"周瑜皱眉沉思。

诸葛亮轻摇羽扇,胸有成竹地说:“依我之见,可在沿江设立烽火台。一旦发现敌情,就点燃烽火。烟起之处,必有敌军。”

周瑜眼前一亮:“妙哉!如此一来,我军可随时掌握敌军动向,做到有备无患。”

就这样,一个个烽火台如同哨兵一般,矗立在长江沿岸。每个烽火台都配备了专人日夜值守,一旦发现曹军动向,立即点燃烽火。

某日,最前线的烽火台守卫突然发现曹军前锋部队的踪迹。

"快!点燃烽火!"守卫大喊。

刹那间,滚滚浓烟冲天而起。紧接着,第二个、第三个烽火台接连点燃,烟雾信号如同多米诺骨牌一般迅速传递。

江畔军帐内,周瑜正在与诸葛亮商议军情。突然,一名士兵匆匆跑来:

“报!前线烽火大起,曹军已至!”

周瑜与诸葛亮相视一笑,胸有成竹地说:“传令下去,按计行事!”

观察者模式解析

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

在赤壁之战的烽火台系统中,我们可以清晰地看到观察者模式的影子:

  • 烽火台就是被观察的主题(Subject)
  • 各个军事单位(如周瑜、诸葛亮的指挥部)就是观察者(Observer)
  • 烽火的点燃就是状态的改变
  • 烟雾信号的传递就是通知机制

让我们用一个类图来理解观察者模式的结构:

image-20240707223121510

代码实现

让我们用 Java 来实现这个烽火台系统:

import java.util.ArrayList;
import java.util.List;// 观察者接口
interface MilitaryUnit {void update(String message);
}// 主题(烽火台)
class BeaconTower {private List<MilitaryUnit> observers = new ArrayList<>();private String message;public void attach(MilitaryUnit observer) {observers.add(observer);}public void detach(MilitaryUnit observer) {observers.remove(observer);}public void notify(String message) {this.message = message;for (MilitaryUnit observer : observers) {observer.update(message);}}public void signalEnemyMovement(String message) {System.out.println("烽火台: " + message);notify(message);}
}// 具体观察者
class CommandCenter implements MilitaryUnit {private String name;public CommandCenter(String name) {this.name = name;}@Overridepublic void update(String message) {System.out.println(name + " 收到消息: " + message);}
}// 主类
public class ObserverPatternDemo {public static void main(String[] args) {BeaconTower beaconTower = new BeaconTower();CommandCenter zhouYu = new CommandCenter("周瑜");CommandCenter zhuGeLiang = new CommandCenter("诸葛亮");beaconTower.attach(zhouYu);beaconTower.attach(zhuGeLiang);beaconTower.signalEnemyMovement("曹军前锋已到达赤壁!");}
}

运行结果

烽火台: 曹军前锋已到达赤壁!
周瑜 收到消息: 曹军前锋已到达赤壁!
诸葛亮 收到消息: 曹军前锋已到达赤壁!

观察者模式的妙用

通过赤壁之战的烽火台系统,我们可以看到观察者模式的几个关键优点:

  1. 解耦合:烽火台(主题)不需要知道具体有哪些军事单位(观察者)在监听它,军事单位也不需要了解烽火台的内部实现。这种松耦合的设计提高了系统的灵活性。
  2. 可扩展性:如果需要增加新的响应单位(如后勤部门),只需创建新的观察者并注册到烽火台,而不需要修改现有代码。
  3. 广播通信:一个消息可以迅速传达给多个接收者,就像烽火一起,整个防线都能快速得知敌情。
  4. 响应式设计:观察者模式非常适合实现响应式的系统设计,当状态变化时,所有相关部分都能及时更新。

结语

诸葛亮的烽火台系统不仅助力赤壁之战取得胜利,也为我们揭示了观察者模式的精髓。在现代软件开发中,观察者模式被广泛应用于图形用户界面、事件处理系统、消息推送服务等多个领域。

正所谓"运筹帷幄之中,决胜千里之外",掌握了观察者模式,我们就能构建出反应灵敏、结构优良的软件系统,在瞬息万变的数字战场中立于不败之地。

在下一章中,我们将继续我们的设计模式之旅,探索更多三国智慧与现代软件设计的精妙结合。敬请期待!

参考原文:https://offernow.cn
AI学习助手:https://aistar.cool

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

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

相关文章

UNION、UNION ALL、INTERSECT、MINUS

UNION、UNION ALL、INTERSECT、MINUS&#xff1f; 说明 UNION&#xff1a;对两个结果集进行并集操作&#xff0c;不包括重复行&#xff0c;同时进行默认规则的排序&#xff1b;IUNION ALL&#xff1a;对两个结果集进行并集操作&#xff0c;包括重复行&#xff0c;不进行排序&am…

OpenAI的崛起:从梦想到现实

OpenAI的崛起不仅是人工智能领域的重大事件&#xff0c;也是科技史上一个引人注目的篇章。本文将深入探讨OpenAI从创立到如今的演变过程&#xff0c;分析其成功的关键因素&#xff0c;以及未来的发展方向。 一、OpenAI的初创期&#xff1a;理想主义与混乱并存 OpenAI成立于20…

插入排序——C语言

假设我们现在有一个数组&#xff0c;对它进行排序&#xff0c;插入排序的算法如同它的名字一样&#xff0c;就是将元素一个一个插入到合适的位置&#xff0c;那么&#xff0c;该如何做呢&#xff1f; 如果我们要从小到大进行排序的话&#xff0c;步骤如下&#xff1a; 1.对于…

区间最值问题-RQM(ST表,线段树)

1.ST表求解 ST表的实质其实是动态规划&#xff0c;下面是区间最小的递归公式&#xff0c;最大只需将min改成max即可 f[i][j] min(f[i][j - 1], f[i (1 << j - 1)][j - 1]); 二维数组的f[i][j]表示从i开始连续2*j个数的最小/大值。 例如&#xff1a;我们给出一个数组…

uniapp启动安卓模拟器mumu

mumu模拟器下载 ADB&#xff1a; android debug bridge &#xff0c; 安卓调试桥&#xff0c;是一个多功能的命令行工具&#xff0c;他使你能够与连接的安卓设备进行交互 # adb连接安卓模拟器 adb connect 127.0.0.1:port # 查看adb设备 adb deviceshubuilderx 有内置的adb&a…

MSPM0G3507——滴答定时器和普通定时

滴答定时器定时&#xff1a;&#xff08;放在主函数即可&#xff09; volatile unsigned int delay_times 0;//搭配滴答定时器实现的精确ms延时 void delay_ms(unsigned int ms) {delay_times ms;while( delay_times ! 0 ); } //滴答定时器中断 void SysTick_Handler(…

Kubernets Apiserver IP 段变更后的故障处理

集群Service IP 段变更后&#xff08;从 10.96.0.0/16 变为 10.17.0.0/16&#xff09;&#xff0c;导致 kubernetes.default.svc 的ClusterIP IP &#xff08;10.96.0.1&#xff09;和段范围不一样&#xff0c;对于这个情况&#xff0c;需要重建该 svc。 重建方法很简单&#…

Python28-7.4 独立成分分析ICA分离混合音频

独立成分分析&#xff08;Independent Component Analysis&#xff0c;ICA&#xff09;是一种统计与计算技术&#xff0c;主要用于信号分离&#xff0c;即从多种混合信号中提取出独立的信号源。ICA在处理盲源分离&#xff08;Blind Source Separation&#xff0c;BSS&#xff0…

运维---关于服务治理Nacos的快问快答

问题&#xff1a;在服务治理中&#xff0c;服务提供者、服务消费者和注册中心分别承担着怎样的角色&#xff1f; 回答&#xff1a; 服务提供者主要负责暴露服务接口&#xff0c;以供其他服务进行调用。 服务消费者的职责是调用其他服务所提供的接口。 注册中心则承担着记录…

【机器学习】(基础篇一) —— 什么是机器学习

什么是机器学习 本系列博客为你从机器学习的介绍开始&#xff0c;使用大量的代码实战和验证&#xff0c;最终帮助你完全掌握什么是机器学习 人工智能、机器学习和深度学习的关系 人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;&#xff1a;是一门研…

Java多线程不会?一文解决——

方法一 新建类如MyThread继承Thread类重写run()方法再通过new MyThread类来新建线程通过start方法启动新线程 案例&#xff1a; class MyThread extends Thread {public MyThread(String name) {super(name);}Overridepublic void run() {for(int i0;i<10;i){System.out.…

react dangerouslySetInnerHTML将html字符串以变量方式插入页面,点击后出现编辑状态

1.插入变量 出现以下编辑状态 2.解决 给展示富文本的标签添加css样式 pointerEvents: none

黑马点评,生成1000个token到redis代码和1k个token的文件

原来的sql文件里面就可以插入1k个用户&#xff0c; 这个代码是从1000个User列表里面生成1k个token到redis里面 ResourceIUserService userService;Resource private StringRedisTemplate stringRedisTemplate;Testpublic void testGetAll() {List<User> users userServ…

activemq推数据给前端的方式

文章目录 消费者程序接收消息并通过 WebSocket 将消息传递给前端 消费者程序接收消息并通过 WebSocket 将消息传递给前端 ActiveMQ 是一个开源的消息代理服务&#xff0c;可以用来实现各种消息传递模式&#xff0c;包括点对点和发布/订阅模型。要将数据从 ActiveMQ 推送到前端…

那些年背过的面试题——MySQL篇

本文是技术人面试系列 MySQL 篇&#xff0c;面试中关于 MySQL 都需要了解哪些基础&#xff1f;一文带你详细了解&#xff0c;欢迎收藏&#xff01; WhyMysql&#xff1f; NoSQL 数据库四大家族 列存储 Hbase K-V 存储 Redis 图像存储 Neo4j 文档存储 MongoDB 云存储 OSS …

AI大模型的智能心脏:向量数据库的崛起

在人工智能的飞速发展中,一个关键技术正悄然成为AI大模型的智能心脏——向量数据库。它不仅是数据存储和管理的革命性工具,更是AI技术突破的核心。随着AI大模型在各个领域的广泛应用,向量数据库的重要性日益凸显。 01 技术突破:向量数据库的内在力量 向量数据库以其快速检索…

第3章 配置 Vite

1 基本配置 Vite 的配置文件 vite.config.js 是基于 JavaScript 或 TypeScript 的文件&#xff0c;可以使用 ES 模块语法进行导出。Vite 通过这个配置文件来调整各种构建和开发的选项。 1.1 创建配置文件 在项目根目录创建 vite.config.js 文件&#xff1a; // vite.config…

RNN、LSTM与GRU循环神经网络的深度探索与实战

循环神经网络RNN、LSTM、GRU 一、引言1.1 序列数据的迷宫探索者&#xff1a;循环神经网络&#xff08;RNN&#xff09;概览1.2 深度探索的阶梯&#xff1a;LSTM与GRU的崛起1.3 撰写本博客的目的与意义 二、循环神经网络&#xff08;RNN&#xff09;基础2.1 定义与原理2.1.1 RNN…

【Python】组合数据类型:序列,列表,元组,字典,集合

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️Python】 文章目录 前言组合数据类型序列类型序列常见的操作符列表列表操作len()append()insert()remove()index()sort()reverse()count() 元组三种序列类型的区别 集合类型四种操作符集合setfrozens…