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

news2024/10/1 0:39:56

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

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

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

诸葛亮的连环计

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

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

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

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

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

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

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

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

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

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

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

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

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

责任链模式解析

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

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

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

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

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
    // ...

    @Override
    public String toString() {
        return "敌军士气: " + enemyMorale +
               ", 敌军是否混乱: " + isEnemyConfused +
               ", 敌军退路是否被切断: " + isRouteCut;
    }
}

// 战略行动接口
interface StrategicMove {
    void setNext(StrategicMove next);
    void execute(BattleSituation situation);
}

// 佯攻
class FakeAttack implements StrategicMove {
    private StrategicMove next;

    @Override
    public void setNext(StrategicMove next) {
        this.next = next;
    }

    @Override
    public 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;

    @Override
    public void setNext(StrategicMove next) {
        this.next = next;
    }

    @Override
    public 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;

    @Override
    public void setNext(StrategicMove next) {
        this.next = next;
    }

    @Override
    public 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 {
    @Override
    public void setNext(StrategicMove next) {
        // 主攻是最后一环,不需要设置下一个
    }

    @Override
    public 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://www.coloradmin.cn/o/1913170.html

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

相关文章

【安全设备】堡垒机

一、什么是堡垒机 安全运维审计与风险控制系统即堡垒机,前身为跳板机,跳板机是一个简单的管理设备,但缺乏对运维操作的控制和审计能力。堡垒机是一种特定的网络安全设备,用于在一个网络环境中保护数据和网络不受外部和内部用户的…

Python酷库之旅-第三方库Pandas(013)

目录 一、用法精讲 31、pandas.read_feather函数 31-1、语法 31-2、参数 31-3、功能 31-4、返回值 31-5、说明 31-6、用法 31-6-1、数据准备 31-6-2、代码示例 31-6-3、结果输出 32、pandas.DataFrame.to_feather函数 32-1、语法 32-2、参数 32-3、功能 32-4、…

Go语言入门之基础语法

Go语言入门之基础语法 1.简单语法概述 行分隔符: 一行代表一个语句结束,无需写分号。将多个语句写在一行可以用分号分隔,但是不推荐 注释: // 或者/* */ 标识符: 用来命名变量、类型等程序实体。 支持大小写字母、数字…

Golang | Leetcode Golang题解之第226题翻转二叉树

题目: 题解: func invertTree(root *TreeNode) *TreeNode {if root nil {return nil}left : invertTree(root.Left)right : invertTree(root.Right)root.Left rightroot.Right leftreturn root }

Python函数 之 模块和包

1.模块 1, 在Python 中, 每个以 .py 结尾的 Python 代码⽂件 都可以称为是⼀个模块。 2, 在模块中 别⼈书写好的功能(变量, 函数, 类),我们可以拿来直接使⽤。 3, 我们自己写的代码文件, 想要作为模块让别⼈使⽤, 你的代码⽂件名(模块名) 满足标识符的规…

大话光学原理:4.散射:瑞利、拉曼、米氏和布里渊

这是一缕柔和的光,在空气的舞台上轻盈地跳跃。它悠然自得,在宁静的空间中缓缓前行。然而,一片细薄透明的介质挡住了它的脚步,它毫无预兆地撞上了这片障碍。在这短暂的接触中,它被分解成无数微小的粒子,被迫…

LabVIEW电滞回线测试系统

铁电材料的性能评估依赖于电滞回线的测量,这直接关系到材料的应用效果和寿命。传统的电滞回线测量方法操作复杂且设备成本高。开发了一种基于LabVIEW的电滞回线测试系统,解决传统方法的不足,降低成本,提高操作便捷性和数据分析的自…

前端面试题38(js原型与对象)

在JavaScript中,原型(prototype)是核心特性之一,它用于实现对象之间的继承和属性方法的共享。理解原型和对象的关系对于深入学习JavaScript至关重要。下面我会详细解释这两个概念以及它们是如何工作的,并给出一些示例代…

关于Python的类的一些理解

才发现python的类对象只能调用类方法 我想使用对类对象a使用系统调用的len方法就会报错 2.类对象a是什么? 答:是所有的带有self的成员变量 举例说明:红色的就是a里面的东西 class A:def __init__(self,data):self.datadataself.b1self.d{a…

详细分析@FunctionalInterface的基本知识(附Demo)

目录 前言1. 基本知识2. Demo 前言 Java的基本知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)Spring框架从入门到学精(全) 1. 基本知识 FunctionalInterface 是 Java 8 引入的一个注…

理解负载组电路-EAK负载电路解释

负载组具有安全、可靠、操作方便、使用寿命长等特点。了解控制、冷却和负载元件电路的布局和功能对于理解负载组的运行、为应用选择负载组和维护负载组非常重要。以下各节将描述这些电路。 EAK负荷组运行概述 负载组接收来自电源的电力,将其转换为热量,…

【漏洞复现】通达OA v2017 video_file.php 任意文件下载漏洞

免责声明: 本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测…

数据结构之折半查找

折半查找的算法思想: 折半查找又称二分查找,它仅仅适用于有序的顺表。 折半查找的基本思想:首先将给定值key与表中中间位置的元素(mid的指向元素)比较。midlowhigh/2(向下取整) 若key与中间元…

字典树(Tire树)

字典树(Tire树) 字典树是一种多叉树,又称为前缀树。核心思想是利用字符串的公共前缀。 字典树的根节点为空,从根节点到某一节点路径上的字符连接起来构成字符串,完整的字符串在链上而非结点上,一个节点的所有子节点都具有相同公…

AMSR-E L2 降雨子集:GES DISC 的 CloudSat 轨道 V002 (AMSERR_CPR) 位于同一地点

AMSR-E L2 Rainfall Subset, collocated with CloudSat track V002 (AMSERR_CPR) at GES DISC AMSR-E L2 降雨子集,与位于 GES DISC 的 CloudSat 轨道 V002 (AMSERR_CPR) 位于同一地点 简介 这是沿云卫星视场轨迹的 AMSR-E 雨率产品子集。子集的目标是选择并返回…

英福康INFICON FabGuard传感器集成与分析系统PPT

英福康INFICON FabGuard传感器集成与分析系统PPT

14-65 剑和诗人39 - 打造你自己的 Devin

​​​​​ 绝密 Devin 架构 更具体地说,构建您自己的 AI 代理。 Devin 使用 GPT-4 ,而人们已经开始用 Claude-3-Opus 构建替代方案 Devin 的 UI 体验更好。 例如,它甚至看不到浏览器,但它确实存在于用户面前 此外,你可以随时与它“交谈”,就像与人交谈一样,它会在后…

使用linux的mail命令发送html格式的邮件

1、关闭本机的sendmail服务或者postfix服务 #执行下面的命令,各位大侠都对号入座吧 #sendmial service sendmail stop chkconfig sendmail off #postfix service postfix stop chkconfig postfix off#再狠一点就直接卸载吧.. yum remove sendmail yum remove postf…

操作系统:信号究竟是什么?如何产生?

OS信号 一、信号的概念二、信号的产生1)终端按键产生信号1、 前台进程、后台进程2、验证终端按键是否产生信号 2)调用系统函数向进程发信号3)硬件异常产生信号1、浮点数溢出,CPU产生信号2 浮点数溢出,产生信号原理3. 空…

【深度学习基础】MAC pycharm 专业版安装与激活

文章目录 一、pycharm专业版安装二、激活 一、pycharm专业版安装 PyCharm是一款专为Python开发者设计的集成开发环境(IDE),旨在帮助用户在使用Python语言开发时提高效率。以下是对PyCharm软件的详细介绍,包括其作用和主要功能&…