诸葛亮的连环计 责任链模式

“万事谋定而后动,一环扣一环,方能成大事。”

在三国时期,诸葛亮以其超凡的智慧闻名天下。在他众多的计策中,有一个鲜为人知却极具智慧的连环计,完美诠释了现代软件设计中的责任链模式。让我们一同探索这个巧妙的计策,揭示责任链模式的奥秘。

连环妙计出奇谋,
层层推进显神通。
责任传递如流水,
一环扣一环成功。

诸葛亮的连环计

建兴七年,诸葛亮率军北伐,欲夺取陇右。然而,魏国名将张郃据守陇右,易守难攻。诸葛亮深知强攻难下,便设计了一个巧妙的连环计。

首先,诸葛亮命令马谡佯攻秦岭,引起张郃注意。

"报!马谡将军正在进攻秦岭!"探子急匆匆地向张郃禀报。

张郃闻讯,立即调兵遣将,加强秦岭防守。

见此情景,诸葛亮微微一笑,随即下令魏延在陇西制造骚动。

不多时,又有探子来报:“魏延将军正在陇西四处劫掠!”

张郃不得不分兵应对,陇右防线顿时捉襟见肘。

就在张郃疲于奔命之际,诸葛亮又命令姜维假装投降,混入魏军中。

姜维成功潜入魏营后,借机散布谣言:“蜀军主力已经绕道天水,准备切断我军退路!”

张郃闻讯大惊,立刻命令大军后撤,准备迎击可能出现的蜀军主力。

就在此时,诸葛亮终于亲自率领主力军,直取陇右。

张郃猝不及防,节节败退,最终被迫放弃陇右。

事后,诸葛亮向众将解释道:“此计共有四环:佯攻、骚扰、离间、主攻。每一环都有其作用,层层推进,最终达成目标。若缺一环,则难以成功。”

责任链模式解析

责任链模式为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。

诸葛亮的连环计完美地诠释了责任链模式的核心思想:

  • 每一个计策(佯攻、骚扰、离间、主攻)都是链条上的一环
  • 每个环节都有特定的职责,共同构成了完整的战略
  • 计划的执行如同请求在责任链上的传递,每个环节都对局势进行处理并为下一环节创造条件

让我们用类图来理解责任链模式的结构:

image-20240709221450671

代码实现

让我们用 Java 来实现这个连环计:

// 战况类
class BattleSituation {private int enemyMorale;private boolean isEnemyConfused;private boolean isRouteCut;public BattleSituation() {this.enemyMorale = 100;this.isEnemyConfused = false;this.isRouteCut = false;}// Getters and setters// ...@Overridepublic String toString() {return "敌军士气: " + enemyMorale +", 敌军是否混乱: " + isEnemyConfused +", 敌军退路是否被切断: " + isRouteCut;}
}// 战略行动接口
interface StrategicMove {void setNext(StrategicMove next);void execute(BattleSituation situation);
}// 佯攻
class FakeAttack implements StrategicMove {private StrategicMove next;@Overridepublic void setNext(StrategicMove next) {this.next = next;}@Overridepublic void execute(BattleSituation situation) {System.out.println("马谡佯攻秦岭,吸引敌军注意...");situation.setEnemyMorale(situation.getEnemyMorale() - 10);if (next != null) {next.execute(situation);}}
}// 骚扰
class Harassment implements StrategicMove {private StrategicMove next;@Overridepublic void setNext(StrategicMove next) {this.next = next;}@Overridepublic void execute(BattleSituation situation) {System.out.println("魏延在陇西制造骚动,分散敌军兵力...");situation.setEnemyMorale(situation.getEnemyMorale() - 20);if (next != null) {next.execute(situation);}}
}// 离间
class Infiltration implements StrategicMove {private StrategicMove next;@Overridepublic void setNext(StrategicMove next) {this.next = next;}@Overridepublic void execute(BattleSituation situation) {System.out.println("姜维假装投降,散布谣言...");situation.setEnemyConfused(true);situation.setEnemyMorale(situation.getEnemyMorale() - 30);if (next != null) {next.execute(situation);}}
}// 主攻
class MainAttack implements StrategicMove {@Overridepublic void setNext(StrategicMove next) {// 主攻是最后一环,不需要设置下一个}@Overridepublic void execute(BattleSituation situation) {System.out.println("诸葛亮率领主力军直取陇右...");situation.setRouteCut(true);situation.setEnemyMorale(0);System.out.println("陇右被我军占领!");}
}// 诸葛亮
class ZhugeLiang {private StrategicMove firstMove;public void setStrategy(StrategicMove first) {this.firstMove = first;}public void executeStrategy() {BattleSituation situation = new BattleSituation();System.out.println("初始战况:" + situation);firstMove.execute(situation);System.out.println("最终战况:" + situation);}
}// 主类
public class ChainOfResponsibilityDemo {public static void main(String[] args) {ZhugeLiang zhugeLiang = new ZhugeLiang();StrategicMove fakeAttack = new FakeAttack();StrategicMove harassment = new Harassment();StrategicMove infiltration = new Infiltration();StrategicMove mainAttack = new MainAttack();fakeAttack.setNext(harassment);harassment.setNext(infiltration);infiltration.setNext(mainAttack);zhugeLiang.setStrategy(fakeAttack);System.out.println("诸葛亮:开始执行连环计!");zhugeLiang.executeStrategy();}
}

运行结果

诸葛亮:开始执行连环计!
初始战况:敌军士气: 100, 敌军是否混乱: false, 敌军退路是否被切断: false
马谡佯攻秦岭,吸引敌军注意...
魏延在陇西制造骚动,分散敌军兵力...
姜威假装投降,散布谣言...
诸葛亮率领主力军直取陇右...
陇右被我军占领!
最终战况:敌军士气: 0, 敌军是否混乱: true, 敌军退路是否被切断: true

责任链模式的妙用

通过诸葛亮的连环计,我们可以看到责任链模式的几个关键优点:

  1. 解耦:每个战略行动都是独立的,它们不需要知道其他行动的存在。
  2. 灵活性:可以轻松地添加、删除或重新排序战略行动,而不影响整体结构。
  3. 单一职责:每个战略行动只负责自己的任务,使得代码更加清晰和易于维护。
  4. 动态性:可以在运行时动态地构建责任链,适应不同的战略需求。

在现代软件开发中,责任链模式有着广泛的应用:

  • 请求处理:如 HTTP 请求通过一系列的过滤器。
  • 日志记录:不同级别的日志可以由不同的处理者处理。
  • 异常处理:异常可以在不同的层级被捕获和处理。
  • 工作流引擎:业务流程中的每个步骤可以被建模为责任链中的一环。

结语

诸葛亮的连环计不仅展现了他高超的军事才能,也为我们诠释了责任链模式的精髓。在软件设计中,我们常常需要处理一系列复杂的步骤或决策。通过责任链模式,我们可以将这些步骤解耦,使得每个步骤都专注于自己的任务,但是又能无缝协作,最终达成目标。

正如诸葛亮的连环计层层推进,最终攻下陇右,我们在软件开发中也可以通过责任链模式,构建出灵活、可扩展、易维护的系统。让我们铭记这个智慧,在面对复杂问题时,也能运筹帷幄,决胜千里。

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

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

zookeeper加入开机启动项

Windows的任务计划程序(Task Scheduler)是一个强大的工具,允许你安排程序在特定时间自动运行,包括开机时。 打开任务计划程序: 按下Win R键,打开“运行”对话框。输入taskschd.msc并回车,打开…

数据结构--单向链表篇(python实现)

写在开头 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer) 链表的优缺点 优点 不需要预先知道数据大小,实现灵…

前端面试题37(js递归)

在JavaScript中,递归是一种编程技术,它允许函数调用自身来解决问题。这种方法通常用于处理分治策略的算法,比如遍历树形结构、计算阶乘、 Fibonacci数列等。下面通过几个示例来说明如何使用递归。 1. 计算阶乘 阶乘是一个经典的递归示例&am…

硬盘分区读不出来的应对策略与数据恢复实战

在日常的计算机使用过程中,硬盘分区读不出来的问题时常困扰着用户。这一故障不仅可能导致重要数据的突然失联,还可能对系统的稳定运行造成威胁。硬盘分区读不出来,往往表现为在文件资源管理器中无法访问特定分区,系统提示错误或分…

信创:鲲鹏(arm64)+麒麟(kylin v10)离线部署k8s和kubesphere(含离线部署新方式)

本文将详细介绍,如何基于鲲鹏CPU(arm64)和操作系统 Kylin V10 SP2/SP3,利用 KubeKey 制作 KubeSphere 和 Kubernetes 离线安装包,并实战部署 KubeSphere 3.3.1 和 Kubernetes 1.22.12 集群。 服务器配置 主机名IPCPUOS用途master-1192.168.10…

jitsi 使用JWT验证用户身份

前言 Jitsi Meet是一个很棒的会议系统,但是默认他运行所有人创建会议,这样在某种程度上,我们会觉得他不安全,下面我们就来介绍下使用JWT来验证用户身份 方案 卸载旧的lua依赖性sudo apt-get purge lua5.1 liblua5.1-0 liblua5.1-dev luarocks添加ubuntu的依赖源,有则不需…

D2D用户的功率优化算法研究

D2D通信技术是指两个对等的用户节点之间直接进行通信的一种通信方式。在由D2D通信用户组成的分布式网络中,每个用户节点都能发送和接收信号,并具有自动路由(转发消息)的功能。网络的参与者共享它们所拥有的一部分硬件资源,包括信息处理、存储…

HTML5表单的自动验证、取消验证、自定义错误信息

1、自动验证 通过在元素中使用属性的方法,该属性可以实现在表单提交时执行自动验证的功能。下面是关于对元素内输入内容进行限制的属性的指定。 属性说明required输入内容是否不为空pattern输入的内容是否符合指定格式min、max输入的数值是否在min~max范围step判断…

使用Maven命令将第三方jar包安装到maven本地仓库

使用Maven命令将第三方jar包安装到maven本地仓库 事例: 第三方jar包 :common-pojo-1.0-SNAPSHOT.jar Maven命令 mvn install:install-file -Dfilejar包在本地磁盘的路径 -DgroupId组织名称 -DartifactId项目名称 -Dversion版本号 -Dpackaging打包方式 完…

【初阶数据结构】1.算法复杂度

文章目录 1.数据结构前言1.1 数据结构1.2 算法1.3 如何学好数据结构和算法 2.算法效率2.1 复杂度的概念2.2 复杂度的重要性 3.时间复杂度3.1 大O的渐进表示法3.2 时间复杂度计算示例3.2.1 示例13.2.2 示例23.2.3 示例33.2.4 示例43.2.5 示例53.2.6 示例63.2.7 示例7 4.空间复杂…

乐器培训课程报名小程序模板源码

模板介绍 一款实用的音乐课程,乐器培训,艺术类网页课程报名手机小程序模板下载。包含:主页、列表、个人中心、报名等模块。 图片演示 乐器培训课程报名小程序模板源码

6.MkDocs附录

安装插件 在 MkDocs 中,插件通常是通过 pip​ 工具安装的。你可以使用以下步骤来安装和配置 MkDocs 插件。 1.使用 pip​ 命令安装你需要的插件。例如 pip install pymdown-extensions‍ 2.更新 mkdocs.yml​ 文件。 ‍ 3.使用 mkdocs serve​ 命令本地预览你…

PHP禁止IP访问和IP段访问(代码实例)

PHP禁止IP和IP段访问 实现IP限制是Web开发中常见的需求之一&#xff0c;它可以用于限制特定IP地址的访问权限。在PHP中&#xff0c;我们可以通过一些方法来实现IP限制。 <?//禁止某个IP$banned_ip array ("127.0.0.1",//"119.6.20.66","192.168.…

旷野之间2 - 如何训练医疗保健小型语言模型(AI-SLM)

​​​​ 在本文中,我们将研究如何针对疾病症状训练一个小型医疗保健语言模型。为此,我们将从HuggingFace获取数据集(用于训练我们的模型):https://huggingface.co/datasets/QuyenAnhDE/Diseases_Symptoms QuyenAnhDE/Diseases_Symptoms 数据集来自 Hugging Face。图片来源…

cesium 雷达扫描

cesium 雷达扫描 (下面附有源码) 实现思路 1、通过改变圆型材质来实现效果, 2、用了模运算和步进函数(step)来创建一个重复的圆形图案 3、当纹理坐标st落在垂直或水平的中心线上时,该代码将改变透明度和颜色,以突出显示这些线 示例代码 <!DOCTYPE html> <ht…

MacOS如何切换shell类型

切换 shell 类型 如果你想在不同的 shell 之间切换&#xff0c;以探索它们的不同之处&#xff0c;或者因为你知道自己需要其中的一个或另一个&#xff0c;可以使用如下命令&#xff1a; 切换到 bash chsh -s $(which bash)切换到 zsh chsh -s $(which zsh)$()语法的作用是运…

04 效用评测层 显性指标+标准方法 对推荐效果定量评测

你好&#xff0c;我是大师兄。前面三节课我们介绍了推荐系统的数据采集层和数据加工层的相关内容&#xff0c;本节课我们重点介绍下推荐系统效用评价层的评测方法和评测指标。 这里的“效用评测”&#xff0c;通俗点说是指推荐系统输出数据的好坏是否符合用户和商业的预期&…

【python】PyQt5事件传递,鼠标动作捕获,键盘按键捕获原理与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

MiniGPT-Med 通用医学视觉大模型:生成医学报告 + 视觉问答 + 医学疾病识别

MiniGPT-Med 通用医学视觉大模型&#xff1a;生成医学报告 视觉问答 医学疾病识别 提出背景解法拆解 论文&#xff1a;https://arxiv.org/pdf/2407.04106 代码&#xff1a;https://github.com/Vision-CAIR/MiniGPT-Med 提出背景 近年来&#xff0c;人工智能&#xff08;AI…

2-1静态库

静态库制作 编写库文件 test.c #include<stdio.h> int main(void){printf("%d\n",add(3,5));return 0; }add.c int add(int a,int b){return ab; }生成.o(目标文件) 用nm查看.o文件 T代表add这个函数的链接性是外部链接&#xff0c;即全局可见&#xff0c;…