(十)趣学设计模式 之 外观模式!

在这里插入图片描述

目录

    • 一、 啥是外观模式?
    • 二、 为什么要用外观模式?
    • 三、 外观模式的实现方式
    • 四、 外观模式的优缺点
    • 五、 外观模式的应用场景
    • 六、 总结

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解桥接模式请看: (九)趣学设计模式 之 桥接模式!

这篇文章带你详细认识一下设计模式中的外观模式

一、 啥是外观模式?

想象一下,你想做一道复杂的菜 🍲 (比如:佛跳墙),你需要准备各种食材 🥕🍄🍖、处理食材 🔪、烹饪食材 🔥等等一系列操作。 如果每次做菜都要手动完成这些步骤,是不是很麻烦 😫? 这时候你可以使用一个“一键烹饪包” 📦,只需要按照说明书操作,就可以自动完成所有步骤!

外观模式,就是为子系统中的一组接口提供一个统一的接口! 外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用 ➕。

简单来说,就是提供一个“傻瓜式”的操作界面,隐藏复杂的内部逻辑! 📦

  • 你想简化复杂系统的使用: 就像你想用一个“一键烹饪包”做出复杂的菜 🍲!
  • 你想降低子系统之间的耦合度: 就像你不想让用户直接依赖于各种食材和烹饪步骤 🥕🍄🍖🔪🔥!
  • 你想为不同的用户提供不同的接口: 就像你想为新手提供简单的烹饪包,为厨师提供更详细的食材和烹饪方法 👨‍🍳!

二、 为什么要用外观模式?

用外观模式,好处多多 👍:

  • 简化接口: 为复杂系统提供一个简单的接口 📦!
  • 降低耦合度: 减少客户端与子系统之间的依赖 🔗!
  • 提高灵活性: 可以方便地修改子系统的内部实现,而不会影响客户端 🤸!
  • 提高安全性: 可以控制客户端对子系统的访问权限 🔒!

三、 外观模式的实现方式

外观模式主要包含以下几个角色:

  • Facade(外观类): 为子系统中的一组接口提供一个统一的接口。 📦 (比如:“一键烹饪包”)
  • SubSystem(子系统): 实现子系统的功能,处理Facade对象指派的任务。 🥕🍄🍖🔪🔥 (比如:食材准备、食材处理、烹饪)

代码示例:

// 子系统:食材准备
public class IngredientPreparation {
    public void prepareVegetables() {
        System.out.println("准备蔬菜");
    }

    public void prepareMeat() {
        System.out.println("准备肉类");
    }
}

// 子系统:食材处理
public class IngredientProcessing {
    public void chopVegetables() {
        System.out.println("切菜");
    }

    public void marinateMeat() {
        System.out.println("腌制肉类");
    }
}

// 子系统:烹饪
public class Cooking {
    public void stirFry() {
        System.out.println("翻炒");
    }

    public void simmer() {
        System.out.println("炖煮");
    }
}

// 外观类:“一键烹饪包”
public class OneClickCookingPackage {
    private IngredientPreparation preparation;
    private IngredientProcessing processing;
    private Cooking cooking;

    public OneClickCookingPackage() {
        this.preparation = new IngredientPreparation();
        this.processing = new IngredientProcessing();
        this.cooking = new Cooking();
    }

    public void cookDish() {
        System.out.println("开始烹饪...");
        preparation.prepareVegetables(); // 准备蔬菜
        preparation.prepareMeat(); // 准备肉类
        processing.chopVegetables(); // 切菜
        processing.marinateMeat(); // 腌制肉类
        cooking.stirFry(); // 翻炒
        cooking.simmer(); // 炖煮
        System.out.println("烹饪完成!");
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        OneClickCookingPackage cookingPackage = new OneClickCookingPackage(); // 创建“一键烹饪包”对象
        cookingPackage.cookDish(); // 开始烹饪
    }
}

分析:

  • IngredientPreparation, IngredientProcessing, Cooking 是子系统,分别实现了食材准备、食材处理和烹饪的功能。
  • OneClickCookingPackage 是外观类,组合了子系统对象,并提供了 cookDish() 方法,简化了烹饪的操作。

输出结果:

开始烹饪...
准备蔬菜
准备肉类
切菜
腌制肉类
翻炒
炖煮
烹饪完成!

四、 外观模式的优缺点

优点:

  • 简化接口 📦!
  • 降低耦合度 🔗!
  • 提高灵活性 🤸!
  • 提高安全性 🔒!

缺点:

  • 不能很好地限制客户使用子系统类,如果客户知道子系统类,还是可以直接使用 😫!
  • 不符合开闭原则,如果需要增加新的子系统,需要修改外观类 😫!

五、 外观模式的应用场景

  • 当你要为一个复杂子系统提供一个简单接口时: 就像“一键烹饪包” 🍲!
  • 当客户程序与多个子系统之间存在很大的依赖性时: 就像客户端需要直接操作各种食材和烹饪步骤 🥕🍄🍖🔪🔥!
  • 当你需要构建一个层次结构的子系统时,使用外观模式定义子系统中每层的入口点: 就像为不同的用户提供不同的烹饪方法 👨‍🍳!
  • 编译器: 编译器可以将复杂的编译过程封装起来,对外提供一个简单的编译接口。

六、 总结

  • 外观模式就像提供一个“傻瓜式”的操作界面,隐藏复杂的内部逻辑! 📦
  • 主要包含外观类和子系统两个角色! 🎭
  • 优点是简化接口、降低耦合度、提高灵活性、提高安全性! 👍
  • 缺点是不能很好地限制客户使用子系统类、不符合开闭原则! 👎
  • 适用于需要简化复杂系统的使用,或者需要降低子系统之间耦合度的场景! 🎯

希望这个例子能让你更容易理解外观模式! 💯 祝你学习愉快! 😄
看完请看:(十 一)趣学设计模式 之 组合模式!

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

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

相关文章

为AI聊天工具添加一个知识系统 之124 详细设计之65 人类文化和习俗,即文化上的差异-根本差异 之2

本文要点 要点 “取” 本身 是一个具有 主谓宾 三格的 多“格”词。 三“格”(主/谓/宾)分别是: 主取,取法(能取:两组分别 是 析取取“异”(三个“不同”)和合取取“同”&#xf…

AXI协议详解及FPGA仿真

AXI协议详解及FPGA仿真 1 摘要 AMBA AXI 协议是以高性能,高频系统设计为目标,提供了很多适合高速亚微型系统互连的特征。为相邻存储器连续进行数据传输提供的一种高频率,高带宽,低延迟的总线协议,是一种突发传输协议…

互联网怎样利用人性-思维导图-markdown

互联网怎样利用人性 傲慢 留言、点评饥饿营销、吵架营销 懒惰 一键下单、扫二维码默认登录、多平台同步单点登录SSO美女论坛、美女头像事业线开箱防御力破女性装饰 贪婪 团购、秒杀、抽奖免费试吃、下载存储空间、在家赚钱晒单返现 窥视 订阅、悄悄关注名人博客微博、惊人标题…

javascript-es6 (五)

内置构造函数 在 JavaScript 中 最主要 的数据类型有 6 种: 基本数据类型: 字符串、数值、布尔、undefined、null 引用类型: 对象 但是,我们会发现有些特殊情况: //普通字符串 const str peiqi console.log(str.length) //…

Hive从入门到运用

hive简介 hive的设计思想(本质是一个翻译器) 上传安装包 解压,查看 运行hive(一定要启动hadoop,是有依赖关系的。) 测试启动方法,和建表 文件创建很上传到hdfs,直接上传到hive表的目…

RK3588部署YOLOv8(1):YOLOv8和YOLOv8-pose转ONNX及Python后处理代码实现

前言 由于种种原因,原始的YOLOv8系列的模型,在RK3588上难以部署,在 .pt 转 .onnx 的时候需要去掉后处理层(主要是DFL层)。因此,模型的后处理需要自己来实现。 本文基于Rockship 官方给的源码(导…

Lua的table(表)

Lua表的基本概念 Lua中的表(table)是一种多功能数据结构,可以用作数组、字典、集合等。表是Lua中唯一的数据结构机制,其他数据结构如数组、列表、队列等都可以通过表来实现。 表的实现 Lua的表由两部分组成: 数组部分…

权限(1)

权限1 一、shell命令及运行原理二、linux中的用户1、身份切换 2、sudo :指令的短暂提权(输入用户自己的密码)3、权限理解4、拥有者,所属组,other5,文件属性6、修改权限(角色 / 属性)…

【实战】使用PCA可视化神经网络提取后的特征空间【附源码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

Lumoz Chain正式上线:AI 时代的新算力破局者

新的叙事和技术突破永远是推动行业前行的核心动力。当下,AI Agent无疑是最炙手可热的赛道之一。 当加密世界将目光投向AI领域时,大多数项目仍停留在以AI为工具或应用场景的层面,试图通过集成AI模型或优化链上功能来吸引用户。然而&#xff0c…

《如何利用看板工具提升学习效率?》

从零开始:用看板工具打造高效学习管理系统 在当今这个信息爆炸的时代,知识更新换代的速度快得惊人,无论是学生、职场人士还是终身学习者,都面临着如何有效管理学习过程、提升学习效率的难题。而板栗看板这款软件,或许…

基于STM32的智能垃圾分类与回收系统

1. 引言 传统垃圾处理方式存在分类效率低、资源浪费严重等问题,难以满足城市可持续发展的需求。本文设计了一款基于STM32的智能垃圾分类与回收系统,通过视觉识别、多传感器融合与自动化分拣技术,实现垃圾精准分类、压缩存储与资源回收&#…

C++:dfs,bfs各两则

1.木棒 167. 木棒 - AcWing题库 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过 5050 个长度单位。 然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度。 请你设计一个程序…

Web端——超级马里奥【简化版】

1.介绍 这是一个简单的受超级马里奥启发的平台游戏演示!这个基于网络的游戏包括: 角色移动:使用箭头键让马里奥向左和向右移动,空格键或向上箭头键跳跃。跳跃平台:游戏中有多个可以跳跃的平台,包括经典的…

PEFT介绍及其源码解析

PEFT库介绍 PEFT(Parameter-Efficient Fine-Tuning,参数高效微调)是由 Hugging Face 开源的一个高效微调库,旨在通过少量可训练参数实现对大型预训练模型的快速适应,从而显著降低计算和存储成本。 核心功能与优势 多…

osgEarth安装总结

第一步:安装OSG 直接通过git下载源码,使用cmake进行编译, git clone --depth 1 https://github.com/openscenegraph/OpenSceneGraph.git mkdir build cd build cmake .. make sudo make isntall编译过程中缺什么库,就安装什么库 …

实体机器人在gazebo中的映射

这一部分目的是将真实的机器人映射到gazebo中,使得gazebo中的其他虚拟机器人能识别到真实世界的wheeltec机器人。 真实机器人的型号的wheeltec旗下的mini_mec。 一、在wheeltec官方百度云文档中找到URDF原始导出功能包.zip 找到对应的包 拷贝到工作空间下 在原有…

8、HTTP/1.0和HTTP/1.1的区别【高频】

第一个是 长连接: HTTP/1.0 默认 短连接,(它也可以指定 Connection 首部字段的值为 Keep-Alive实现 长连接)而HTTP/1.1 默认支持 长连接,HTTP/1.1是基于 TCP/IP协议的,创建一个TCP连接是需要经过三次握手的…

kafka-leader -1问题解决

一. 问题: 在 Kafka 中,leader -1 通常表示分区的领导者副本尚未被选举出来,或者在获取领导者信息时出现了问题。以下是可能导致出现 kafka leader -1 的一些常见原因及相关分析: 1. 副本同步问题: 在 Kafka 集群中&…

stm32hal库寻迹+蓝牙智能车(STM32F103C8T6)

简介: 这个小车的芯片是STM32F103C8T6,其他的芯片也可以照猫画虎,基本配置差不多,要注意的就是,管脚复用,管脚的特殊功能,(这点不用担心,hal库每个管脚的功能都会给你罗列,很方便的.)由于我做的比较简单,只是用到了几个简单外设.主要是由带霍尔编码器电机的车模,电机…