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

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

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

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

烽火连天

公元 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;
    }

    @Override
    public 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.mfbz.cn/a/781455.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探索InitializingBean:Spring框架中的隐藏宝藏

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》《MYSQL》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 ✨欢迎加入探索MYSQL索引数据结构之旅✨ &#x1f44b; Spring框架的浩瀚海洋中&#x…

Javascript常见数据结构和设计模式

在JavaScript中&#xff0c;常见的数据结构包括两大类&#xff1a;原始数据类型&#xff08;Primitive Types&#xff09;和对象类型&#xff08;Object Types&#xff09;。对象类型又可以进一步细分为多种内置对象、数组、函数等。下面是一些JavaScript中常见的数据结构&…

《算法笔记》总结No.4——散列

散列的英文名是hash&#xff0c;即我们常说的哈希~该知识点在王道408考研的教材里面属于查找的范围。即便各位并无深入了解过&#xff0c;也听说过散列是一种更高效的查找方法。 一.引例 先来考虑如下一个假设&#xff1a;设有数组M和N分别如下&#xff1a; M[10][1,2,3,4,5,6…

【Spring AOP 源码解析前篇】什么是 AOP | 通知类型 | 切点表达式| AOP 如何使用

前言&#xff08;关于源码航行&#xff09; 在准备面试和学习的过程中&#xff0c;我阅读了还算多的源码&#xff0c;比如 JUC、Spring、MyBatis&#xff0c;收获了很多代码的设计思想&#xff0c;也对平时调用的 API 有了更深入的理解&#xff1b;但过多散乱的笔记给我的整理…

自动化设备上位机设计 四

目录 一 设计原型 二 后台代码 一 设计原型 二 后台代码 using SimpleTCP; using SqlSugar; using System.Text;namespace 自动化上位机设计 {public partial class Form1 : Form{SqlHelper sqlHelper new SqlHelper();SqlSugarClient dbContent null;bool IsRun false;i…

【机器学习实战】Datawhale夏令营:Baseline精读笔记2

# AI夏令营 # Datawhale # 夏令营 在原有的Baseline上除了交叉验证&#xff0c;还有一种关键的优化方式&#xff0c;即特征工程。 如何优化特征&#xff0c;关系着我们提高模型预测的精准度。特征工程往往是对问题的领域有深入了解的人员能够做好的部分&#xff0c;因为我们要…

链式二叉树oj题

1.输入k &#xff0c;找第k层节点个数 int TreeKlevel(BTNode*root,int k) {if (root NULL) {return 0;}if (k 1) {return 1;}return TreeKlevel(root->left, k - 1)TreeKlevel(root->right, k - 1); } 在这里我们要确定递归子问题&#xff0c;第一个就是NULL时返回&…

强化学习中的Q-Learning和Sarsa算法详解及实战

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是一种通过与环境交互来学习最优策略的机器学习方法。在强化学习中&#xff0c;Q-Learning和Sarsa是两种重要的基于值的算法。本文将详细讲解这两种算法&#xff0c;并通过实际代码示例展示其应用。 1. 强化学习基…

algorithm算法库学习之——不修改序列的操作

algorithm此头文件是算法库的一部分。本篇介绍不修改序列的操作函数。 不修改序列的操作 all_ofany_ofnone_of (C11)(C11)(C11) 检查谓词是否对范围中所有、任一或无元素为 true (函数模板) for_each 应用函数到范围中的元素 (函数模板) for_each_n (C17) 应用一个函数对象到序…

Vue88-Vuex中的mapActions、mapMutations

一、mapMutations的调用 此时结果不对&#xff0c;因为&#xff1a;若是点击事件不传值&#xff0c;默认传的是event&#xff01;&#xff0c;所以&#xff0c;修改如下&#xff1a; 解决方式1&#xff1a; 解决方式2&#xff1a; 不推荐&#xff0c;写法麻烦&#xff01; 1-…

排序算法简述(第八jiang)

目录 排序 选择排序 O(n2) 不稳定&#xff1a;48429 归并排序 O(n log n) 稳定 插入排序 O(n2) 堆排序 O(n log n) 希尔排序 O(n log2 n) 图书馆排序 O(n log n) 冒泡排序 O(n2) 优化&#xff1a; 基数排序 O(n k) 快速排序 O(n log n)【分治】 不稳定 桶排序 O(n…

【图解大数据技术】Flume、Kafka、Sqoop

【图解大数据技术】Flume、Kafka、Sqoop FlumeFlume简介Flume的应用场景 KafkaKafka简介Kafka架构Flume与Kafka集成 SqoopSqoop简介Sqoop原理sqoop搭配任务调度器实现定时数据同步 Flume Flume简介 Flume是一个数据采集工具&#xff0c;多用于大数据技术架构下的日志采集。 …

设计模式之模版方法

模版方法介绍 模版方法&#xff08;Template Method&#xff09;模式是一种行为型设计模式&#xff0c;它定义了一个操作&#xff08;模板方法&#xff09;的基本组合与控制流程&#xff0c;将一些步骤&#xff08;抽象方法&#xff09;推迟到子类中&#xff0c;使得子类可以在…

C语言下的文件详解

主要内容 文件概述文件指针文件的打开与关闭文件的读写 文件 把输入和输出的数据以文件的形式保存在计算机的外存储器上&#xff0c;可以确保数据能随时使用&#xff0c;避免反复输入和读取数据 文件概述 文件是指一组相关数据的有序集合 文件是存储数据的基本单位&#…

# mysql 中文乱码问题分析

mysql 中文乱码问题分析 一、问题分析&#xff1a; MySQL 中文乱码通常是因为字符集设置不正确导致的。MySQL 有多种字符集&#xff0c;如 latin1、utf8、utf8mb4 等&#xff0c;如果在创建数据库、数据表或者字段时没有指定正确的字符集&#xff0c;或者在插入数据时使用了与…

关于Java异常机制及finally关键字的详解

异常机制(Exception) 软件程序在运行过程中&#xff0c;非常可能遇到异常问题。常见的异常&#xff1a; 1、用户输入错误 2、设备错误 3、硬件问题&#xff0c;例如打印机关掉、服务器问题 4、物理限制&#xff1a;磁盘满了 Java是采用面向对象的方式来处理异常的。 处理过程…

哈希表——C语言

哈希表&#xff08;Hash Table&#xff09;是一种高效的数据结构&#xff0c;能够在平均情况下实现常数时间的查找、插入和删除操作。 哈希表的核心是哈希函数&#xff0c;哈希函数是一个将输入数据&#xff08;通常称为“键”或“key”&#xff09;转换为固定长度的整数的函数…

使用vue3-treeselect问题

1.当vue3-treeselect是单选时&#xff0c;使用watch监听绑定value&#xff0c;无法监听到值清空 对照后将:value改为v-model&#xff0c;如图 2.使用vue3-treeselect全部清空按钮如何置空select的值&#xff0c;使用watch监听 多选&#xff1a;pageInfo.officeName(val) {// …

【Linux进阶】文件系统6——理解文件操作

目录 1.文件的读取 1.1.目录 1.2.文件 1.3.目录树读取 1.4.文件系统大小与磁盘读取性能 2.增添文件 2.1.数据的不一致&#xff08;Inconsistent&#xff09;状态 2.2.日志式文件系统&#xff08;Journaling filesystem&#xff09; 3.Linux文件系统的运行 4、文件的删…

Java--方法重写

1.方法的重写首先需要有继承关系&#xff0c;且为子类重写父类的方法 2.方法名必须相同 3.参数列表必须相同 4.修饰符的范围可以扩大但不能缩小&#xff0c;public>protected>default>private,即父类的属性可以从private改为public&#xff0c;但不能反过来 5.抛出…