诸葛亮的空城计 - 代理模式

定场诗

“无形之中蕴含至理,虚实相生方见大道。”

在三国演义中,诸葛亮的空城计可谓神来之笔。这看似冒险的策略,实则蕴含深意。今天,我们将透过空城计,一窥软件设计中代理模式的奥秘。

西城无人旦夕危,
诸葛单骑解危机。
虚张声势胜千军,
代理模式妙无比。

空城妙计

蜀汉建兴七年,诸葛亮率军北伐,屯兵祁山。

一日,探马来报:“司马懿亲率大军来袭,我军主力已退至剑阁,只有少量兵力驻守西城!”

诸葛亮闻言,不慌不忙,吩咐道:“打开城门,除去城上旌旗,每门只留二十个老弱兵丁。”

众将惊愕,马谡问道:“军师,这是为何?”

诸葛亮笑道:“兵法云:‘出其不意,攻其不备’。司马懿素知我谨慎,若见城门大开,必疑有伏兵。我们以逸待劳,反而能退敌。”

说罢,诸葛亮命人在城楼上设下桌案,焚香鼓琴,悠然自得。

不多时,司马懿率军来到城下。见此情景,司马懿大惊:“诸葛亮用兵如神,此必有诈!全军撤退!”

待司马懿退军后,诸葛亮才道出实情:“我军中只有两千五百人,若非用此计,难逃一劫。”

代理模式解析

代理模式为其他对象提供一种代理以控制对这个对象的访问。

诸葛亮的空城计与代理模式有异曲同工之妙:

  • 诸葛亮代表了真实对象(实际上防守薄弱的城池)
  • 空城计就是一个代理,它呈现出一种强大防御的假象
  • 司马懿是客户端,他通过观察这个代理(空城计)来判断是否进攻

让我们用类图来理解代理模式的结构:

image-20240707223625051

代码实现

让我们用 Java 来实现这个空城计系统:

// 防御接口
interface CityDefense {void defend();
}// 真实对象:实际的城池防御
class ActualCityDefense implements CityDefense {private int soldiers;public ActualCityDefense(int soldiers) {this.soldiers = soldiers;}@Overridepublic void defend() {System.out.println("城中有" + soldiers + "名士兵准备战斗!");}
}// 代理对象:诸葛亮的空城计
class EmptyCityStrategy implements CityDefense {private ActualCityDefense realDefense;public EmptyCityStrategy(int soldiers) {this.realDefense = new ActualCityDefense(soldiers);}@Overridepublic void defend() {if (shouldUseStrategy()) {System.out.println("诸葛亮施展空城计:城门大开,琴声悠扬。");} else {realDefense.defend();}}private boolean shouldUseStrategy() {// 模拟诸葛亮的判断return Math.random() > 0.5;}
}// 司马懿
class SimaYi {public void attack(CityDefense city) {System.out.println("司马懿来袭...");city.defend();// 司马懿的反应if (Math.random() > 0.5) {System.out.println("司马懿:此必有诈,全军撤退!");} else {System.out.println("司马懿:发起进攻!");}}
}// 主类
public class ProxyPatternDemo {public static void main(String[] args) {CityDefense xiCity = new EmptyCityStrategy(2500);SimaYi simaYi = new SimaYi();simaYi.attack(xiCity);}
}

运行结果

司马懿来袭...
诸葛亮施展空城计:城门大开,琴声悠扬。
司马懿:此必有诈,全军撤退!

代理模式的妙用

通过诸葛亮的空城计,我们可以看到代理模式的几个关键优点:

  1. 控制访问:代理可以控制对真实对象的访问,就像空城计控制了司马懿对城池真实防御情况的认知。
  2. 延迟加载:代理可以延迟创建开销大的对象,直到真正需要时才创建。
  3. 添加额外功能:代理可以在不改变原对象的情况下,添加额外的功能,如日志记录、访问控制等。
  4. 远程代理:可以为远程对象提供本地代表。

结语

诸葛亮的空城计不仅展现了其高超的军事才能和心理洞察力,也为我们揭示了代理模式的精髓。在软件开发中,代理模式被广泛应用于远程方法调用、虚拟代理、保护代理等多个领域,为系统提供了更大的灵活性和安全性。

正如诸葛亮以虚势退敌,我们也可以通过代理模式巧妙地控制对象的访问,增强系统的安全性和灵活性。掌握这种设计模式,我们就能在软件架构中运筹帷幄,决胜千里之外。

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

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

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

相关文章

君方智能设计平台-事务管理技术方案

1.背景介绍 事务处理是指对数据进行一组操作,这些操作要么全部成功,要么全部失败,以确保数据的一致性和完整性。软件的事务管理主要实现方案主要涉及以下几个方面: (1)数据一致性:在CAD软件中…

STM32实现看门狗(HAL库)

文章目录 一. 看门狗1. 独立看门狗(IWDG)1.1 原理1.2 相关配置1.3 相关函数 2. 窗口看门狗(WWDG)2.1 原理2.2 相关配置2.3 相关函数 一. 看门狗 单片机在日常工作中常常会因为用户配置代码出现BUG,而导致芯片无法正常工…

Flask项目搭建及部署(完整版!全网最全)

flask搭建及部署 pip 19.2.3 python 3.7.5 Flask 1.1.1 Flask-SQLAlchemy 2.4.1 Pika 1.1.0 Redis 3.3.11 flask-wtf 0.14.2 1、创建flask项目: 创建完成后整个项目结构树: app.py: 项⽬管理⽂件,通过它管理项⽬。 static: 存放静态文…

map和set的原理、优劣势、应用场景和示例代码,统统告诉你。

map和set的原理都是基于哈希表实现的,通过哈希值来快速查找和插入元素,从而实现高效的数据存储和管理,那么他们之间有什么不同呢,该如何选择,本文带你了解。 一、map和set的原理 map和set都是数据结构,用…

【分布式系统三】监控平台Zabbix对接grafana(截图详细版)

目录 一.安装grafana并启动 二.浏览器访问 三.导入zabbix数据,对接grafana 四.如何导入模版 以前两篇博客为基础 【分布式系统】监控平台Zabbix介绍与部署(命令截图版)-CSDN博客 【分布式系统】监控平台Zabbix自定义模版配置-CSDN博客 …

java ReadWriteLock接口

在 Java 中,ReadWriteLock 接口的实现类ReentrantReadWriteLock 类提供了一种允许多个线程同时读取某一资源但只允许一个线程写的锁定机制。这种机制可以提高并发性能,特别是在读操作远多于写操作的场景下。 特性: 可重入;不存…

前端使用Threejs加载机械臂并控制机械臂跳舞

1. 前言 在我的第一篇博客中,大致讲解了如何使用threejs导入机械臂模型,以及如何让机械臂模型动起来的案例,可以看一下之前的博客前端使用Threejs控制机械臂模型运动 本篇博客主要讲解的是在原来的基础上添加GSAP动画库的应用,可以通过动画,来让机械臂进行指定轨迹位姿的运动…

基于SpringBoot的休闲娱乐代理售票系统

本系统主要包括管理员和用户两个角色组成;主要包括:首页、个人中心、用户管理、折扣票管理、分类管理、订单信息管理、退票信息管理、出票信息管理、系统管理等功能的管理系统。 💕💕作者:Weirdo 💕&#x…

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

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

GTP/GTX 手动对齐,谈谈思路。

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

【server】springboot 整合 redis

1、redis 使用模式 1.1 单机模式 1.1.1 编译安装方式 1.1.1.1 下载 Redis的安装非常简单,到Redis的官网(Downloads - Redis),下载对应的版本,简单几个命令安装即可。 1.1.1.2 编译安装 tar xzf redis-stable.tar.…

GPU发展史(二):改变游戏规则的3Dfx Voodoo

小伙伴们,大家好呀,我是老猫。 在上一篇GPU发展史(一)文章中,我们介绍了1976-1995期间早期显卡的发展故事,今天我们将介绍在1995-1999年这段时间显卡的故事,而这段故事的主角就是——3Dfx 提起…

探索多模态预训练:MAnTiS、ActionCLIP、CPT与CoOp的Prompt技巧

上一篇博文整理了 预训练新范式(Prompt-tuning,Prefix-tuning,P-tuning) ,主要是围绕NLP上的成果,具体的概念本文也不做过多赘述。本篇文章将主要整理几篇有代表性的Prompt方法在多模态领域中的应用。 Mult…

【ARMv8/v9 GIC 系列 1.7 -- GIC PPI | SPI | SGI | LPI 中断使能配置介绍】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 GIC 各种中断使能配置PPIs(每个处理器私有中断)SPIs(共享外设中断)SGIs(软件生成的中断)LPIs(局部中断)GIC 各种中断使能配置 在ARM GICv3和GICv4架构中,不同类型的中断(如PPIs、SPIs、SGIs和LPIs)可以通过不同的方式进…

RabbitMQ(集群相关部署)

RabbitMQ 集群部署 环境准备:阿里云centos8 服务器,3台服务器,分别进行安装; 下载Erlang Erlang和RabbitMQ版本对照:https://www.rabbitmq.com/which-erlang.html 创建yum库配置文件 vim /etc/yum.repos.d/rabbi…

生物墨水:3D组织生物打印的基石

生物墨水是3D组织生物打印技术的核心组成部分。生物墨水通常由生物材料(如水凝胶聚合物)与所需的细胞和/或其他生物大分子(例如生长因子)混合而成。为了成功地进行组织生物打印,生物墨水必须满足以下要求: …

为什么要设计DTO类

为什么要使用DTO类,下面以新增员工接口为例来介绍。 新增员工 1.1 需求分析和设计 1.1.1 产品原型 一般在做需求分析时,往往都是对照着产品原型进行分析,因为产品原型比较直观,便于我们理解业务。 后台系统中可以管理员工信息…

Bug记录:【com.fasterxml.jackson.databind.exc.InvalidDefinitionException】

bug记录 序列化错误 异常com.fasterxml.jackson.databind.exc.InvalidDefinitionException: 完整错误(主要是FAIL_ON_EMPTY_BEANS) 00:15:20.250 [http-nio-3000-exec-1] ERROR org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet] - S…

数据驱动的内容优化:Kompas.ai如何提升内容表现

在数字化营销时代,内容是企业与用户沟通的重要桥梁。然而,随着信息量的爆炸性增长,如何让内容在激烈的竞争中脱颖而出,成为每个营销人员面临的问题。数据驱动的内容优化策略,通过精准分析和科学决策,帮助品…

线程安全(一)Java锁(锁分类、锁升级、锁优化)

目录 一、乐观锁二、悲观锁三、自旋锁3.1 自旋锁的优缺点:3.2 自旋锁的时间阈值:3.3 自旋锁的开启:四、Synchronized 同步锁4.1 Synchronized 作用范围:4.2 Synchronized 核心组件:4.3 Synchronized 实现:4.4 Synchronize 补充:五、ReentractLock 锁5.1 Lock 接口的主要…