16.沙箱里的秩序——外观模式

在这里插入图片描述
在这里插入图片描述
然后,冯·诺伊曼又用三名士兵构建了与非门、或非门、异或门、同或门和三态门,最后只用两名士兵构建了最简单的非门,出总是举与入颜色相反的旗。
冯:诺伊曼对皇帝鞠躬说:“现在,陛下,所有的门部件都已演示完毕,这很简单不是吗?任何三名士兵经过一小时的训练就可以掌握。
“他们不需要学更多的东西了吗?”秦始皇问。
不需要,我们组建一千万个这样的门部件,再将这些部件组合成一个系统,这个系统就能进行我们所需要的运算,解出那些预测太阳运行的微分方程。这个系统,我们把它叫做……嗯,叫做
“计算机。”汪淼说。
“啊–好!"冯·诺伊曼对汪淼竖起一根指头,"计算机,这个名字好,整个系统实际上就是一部庞大的机器,是有史以来最复杂的机器!
——《三体》

人列计算机无疑是《三体》中最震撼的场景之一,在小说中,“冯诺依曼”让每三个人组成一个门部件,整整动用了“秦始皇”三千万个士兵,组成了一个包含一千万门部件的巨型计算机,只为了尝试解决三体运行的终极问题——测算下一个恒纪元。
在这里插入图片描述

将微观的、结构化的事物宏观化的、成体系的展示出来,往往会给人以震撼心灵的感受。 就像大火的透明主机机箱设计一样,相信大部分对计算机感兴趣的人都会和笔者一样对它毫无抵抗力。
今天,我就以半开放过程的角度,以计算机运行的视角,在领略计算机魅力的同时,尝试拆解一下什么是外观模式


一言

外观模式就是通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节。


你好,冯诺依曼

我们可以暂时把计算机的启动过程浅显的理解为:

  1. CPU处理数据
  2. 内存加载数据
  3. 硬盘驱动读取数据

突然,你一阵头晕目眩,发现自己就是《三体》中正在给秦始皇设计 “秦一号人列计算机” 的冯诺依曼。你会如何设计?


什么?这还用想?

冯诺依曼一号玩家忍俊不禁,这还用想嘛?面向对象,让秦始皇想调哪个调哪个,已经不能再简单了。
在这里插入图片描述
然而,事与愿违,计算机的启动过程并不像我们假设的这样简单。
在这里插入图片描述
参照这种设计,“秦始皇”需要亲自对成千上万个门部件下达具体的指令。当“秦始皇”得知了这种设计的交互实质后,直接将“冯诺依曼”送上了断头台。


是的,还真得想想

骄横的“冯诺依曼”玩家再次进入了游戏并陷入了沉思。看来这一关的重点在于如何屏蔽“秦一号”的内部实现细节啊。怎样才能让“秦始皇”轻松的当一个皇帝而不是让他“嵌入”到“人列计算机”内部呢?
有了!
我可以为他提供统一的调用接口,作为外观类,这样只有它知道哪些子系统负责处理请求从而将调用端的请求代理给适当的子系统对象。
“赵高,你过来!陛下要给你个好活!”
在这里插入图片描述


设计

在这里插入图片描述
我们通过将一群复杂的接口转化为一个接口,将繁重的工作交给赵高大人(外观类),而秦始皇(调用者)只需要从赵高那里得到想要的结果就可以了。


代码实现

CPU

interface CPU {void processData();
}
class CPUImpl implements CPU {@Overridepublic void processData() {System.out.println("CPU is processing data.");}
}

Memory

interface Memory {void loadMemory();
}
class MemoryImpl implements Memory {@Overridepublic void loadMemory() {System.out.println("Memory is loading data.");}
}

HardDrive

interface HardDrive {void readData();
}
class HardDriveImpl implements HardDrive {@Overridepublic void readData() {System.out.println("Hard Drive is reading data.");}
}

ComputerFacade(赵高)

class ComputerFacade {private CPU cpu;private Memory memory;private HardDrive hardDrive;public ComputerFacade() {this.cpu = new CPUImpl();this.memory = new MemoryImpl();this.hardDrive = new HardDriveImpl();}public void startComputer() {cpu.processData();memory.loadMemory();hardDrive.readData();System.out.println("Computer started successfully.");}
}

Client(秦始皇)

public class Client {public static void main(String[] args) {ComputerFacade computer = new ComputerFacade();computer.startComputer();}
}

执行

在这里插入图片描述


外观模式在Mybatis源码中的应用

在 MyBatis 中,Configuration 类负责管理 MyBatis 的全局配置信息,包括对映射器、参数映射器、结果映射器等的管理。Configuration 对象在 MyBatis 的启动过程中被创建,并在整个应用程序的生命周期中负责管理各种配置信息。

Configuration 对象在创建的过程中会通过 MetaObject 工具类创建 MetaObject 对象,主要用于处理对象的元数据操作。MetaObject 是 MyBatis 提供的一个工具类,用于方便地访问对象的属性信息,进行对象的属性赋值、获取、判断等操作。

具体在 MyBatis 中,MetaObject 被用来处理配置信息、映射器、参数、结果等的属性访问和操作。通过 MetaObject,可以方便地动态地获取和设置对象的属性值,而不必直接操作对象本身。这样可以提高代码的灵活性和可维护性,使得配置信息的管理更加便捷。

总的来说,Configuration 中通过创建 MetaObject 对象,可以方便地管理和操作 MyBatis 的配置信息,提供了更灵活、方便的方式来处理对象的属性操作,从而实现更加高效和可维护的代码编写。

在Configuration创建MetaObject的过程中,就用到了外观模式。


框架设计

在这里插入图片描述


源码分析

在Configuration创建MetaObject时,用到的MetaObject的forObject方法,在object不为空的情况下,其实质是将ObjectFactory,RelectorFactory,ObjectWrapperFactory组合了进来,并根据实际情况进行了进一步的判断和处理。


相关源码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


外观模式对外屏蔽了子系统的细节,因此我们可以说它降低了客户端对子系统的使用复杂性,在耦合度上它也让子系统的内部模块更容易维护和扩展。
只要外观模式使用的合理,是很容易实现分层设计的。尤其对于一些老系统的维护往往会有奇效。


关注我,共同进步,每周至少一更。——Wayne

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

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

相关文章

【Java程序员面试专栏 算法思维】五 高频面试算法题:贪心算法

一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,本篇主要聊聊贪心算法,所以放到一篇Blog中集中练习 题目关键字解题思路时间空间买卖股票的最佳时机 II贪心算法遍历整个股票交易日价格列表 price,并执行贪心策…

力扣随笔之移除元素(简单27)

思路:定义一个指针left,使该指针及该指针左边的数全部都不等于val,定义一个遍历指针i,若nums[i] val,则i自加,若nums[i] ! val,则将left,并将nums[i]的值赋给nums[left]&#xff0c…

迅速了解Ascii、GBK、Unicode、UTF-8、BCD各种编码格式的由来及关系!

《嵌入式工程师自我修养/C语言》系列——迅速了解Ascii、GBK、Unicode、UTF-8、BCD各种编码格式的由来及关系 一、Ascii编码二、GBK编码三、Unicode编码四、UTF-8编码五、BCD编码六、其他网友的总结 快速学习嵌入式开发其他基础知识?>>>>>>>&g…

Redis实现滑动窗口限流

常见限流算法 固定窗口算法 在固定的时间窗口下进行计数,达到阈值就拒绝请求。固定窗口如果在窗口开始就打满阈值,窗口后半部分进入的请求都会拒绝。 滑动窗口算法 在固定窗口的基础上,窗口会随着时间向前推移,可以在时间内平滑控…

安装 WSL 报错 Error code: Wsl/WININET_E_NAME_NOT_RESOLVED 问题解决

问题描述 在执行 wsl --install 安装Windows子系统Linux WSL (Windows Subsystem for Linux) 时报错: 无法从“https://raw.githubusercontent.com/microsoft/WSL/master/distributions/DistributionInfo.json”中提取列表分发。无法解析服务器的名称或地址 Error…

为什么会员模式是一种明智的扩张方式

会员模式看起来是一种有趣、令人兴奋且很酷的业务发展方式,但当您真正深入研究时,您可能会惊讶地发现它远不止于此。 会员资格为我们提供了一条道德扩展的途径。我们可以就地为客户提供服务。 这就是为什么会员模式可能成为您企业的下一步,…

【监控】grafana图表使用快速上手

目录 1.前言 2.连接 3.图表 4.job和path 5.总结 1.前言 上一篇文章中,我们使用spring actuatorPrometheusgrafana实现了对一个spring boot应用的可视化监控。 【监控】Spring BootPrometheusGrafana实现可视化监控-CSDN博客 其中对grafana只是打开了一下&am…

Jmeter学习系列之七:并发线程组Concurrency Thread Group详解

一、Concurrency Thread Group的介绍 Concurrency Thread Group提供了用于配置多个线程计划的简化方法该线程组目的是为了保持并发水平,意味着如果并发线程不够,则在运行线程中启动额外的线程和Standard Thread Group不同,它不会预先创建所有线程,因此不会使用额外的内存对…

算法分析-面试1-字符串

文章目录 前言一、分类:看看就行了二、字符串API:创建和初始化:查询操作:比较操作:修改操作:截取操作:分割操作:格式化操作:连接操作(Java 8 及以后&#xff…

【OneAPI】渣土车检测API

OneAPI新接口发布:渣土车检测 识别一张图中是否存在渣土车并返回渣土车位置。 API地址:POST https://oneapi.coderbox.cn/openapi/api/detect/mucktruck 请求参数 BODY参数 参数名类型必填含义说明imageUrlstring是图片地址- 响应参数 参数名类型…

day4:对话框与事件

使用qt搭建一个简易的闹钟系统 #include "second.h" #include "ui_second.h"second::second(QWidget *parent) :QWidget(parent),ui(new Ui::second) {ui->setupUi(this);this->setWindowFlag(Qt::FramelessWindowHint);this->setAttribute(Qt::…

小程序--组件通信

一、父传子 与vue利用props类似,小程序是利用自定义属性:properties // components/my-nav/my-nav.js Component({// 小程序组件默认样式是隔离,addGlobalClass设置为true可允许外部修改样式options: {addGlobalClass: true,// 只要使用到具…