赤壁之戰的烽火臺 - 觀察者模式

“當烽火連三月,家書抵萬金;設計模式得其法,千軍如一心。”

在波瀾壯闊的三國歷史長河中,赤壁之戰無疑是一場改變乾坤的重要戰役。而在這場戰役中,一個看似簡單卻至關重要的系統發揮了巨大作用——烽火臺。這個古老的通訊系統,是否讓你聯想到了現代軟件設計中的觀察者模式?今天,讓我們穿越千年,從烽火臺的煙霧中,揭開觀察者模式的神秘面紗。

赤壁江畔戰云起,
烽火一燃天下知。
觀察變化隨機應,
一招制敵保江山。

烽火連天

公元 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.pswp.cn/web/41519.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/41519.shtml
英文地址,請注明出處:http://en.pswp.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…