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

news2025/2/27 17:29:20

在这里插入图片描述

目录

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

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

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

一、 啥是外观模式?

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

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

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

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

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

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

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

三、 外观模式的实现方式

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

  • 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() 方法,简化了烹饪的操作。

输出结果:

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

四、 外观模式的优缺点

优点:

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

缺点:

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

五、 外观模式的应用场景

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

六、 总结

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

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

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

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

相关文章

apache-maven-3.2.1

MAVEN_HOME D:\apache-maven-3.2.1 PATH D:\apache-maven-3.2.1\bin cmd mvn -v <localRepository>d:\localRepository</localRepository> setting.xml <?xml version"1.0" encoding"UTF-8"?><!-- Licensed to the Apache Soft…

编程题-连接两字母单词得到的最长回文串(中等)

题目&#xff1a; 给你一个字符串数组 words 。words 中每个元素都是一个包含 两个 小写英文字母的单词。 请你从 words 中选择一些元素并按 任意顺序 连接它们&#xff0c;并得到一个 尽可能长的回文串 。每个元素 至多 只能使用一次。 请你返回你能得到的最长回文串的 长度…

论文笔记(七十二)Reward Centering(三)

Reward Centering&#xff08;三&#xff09; 文章概括摘要3 基于值的奖励中心化4 案例研究&#xff1a; 以奖励为中心的 Q-learning5 讨论、局限性与未来工作致谢 文章概括 引用&#xff1a; article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan…

【论文笔记-ECCV 2024】AnyControl:使用文本到图像生成的多功能控件创建您的艺术作品

AnyControl&#xff1a;使用文本到图像生成的多功能控件创建您的艺术作品 图1 AnyControl的多控制图像合成。该研究的模型支持多个控制信号的自由组合&#xff0c;并生成与每个输入对齐的和谐结果。输入到模型中的输入控制信号以组合图像显示&#xff0c;以实现更好的可视化。 …

Redisson使用场景及原理

目录 一、前言 二、安装Redis 1、Windows安装Redis ​2、启动方式 3、设置密码 三、项目集成Redission客户端 1、引入依赖 四、实用场景 1、操作缓存 2、分布式锁 3、限流 3.1 创建限流器 3.2 设置限流参数 3.3 获取令牌 3.4 带超时时间获取令牌 3.5 总结 一、…

【二分查找 图论】P8794 [蓝桥杯 2022 国 A] 环境治理|普及

本文涉及的基础知识点 本博文代码打包下载 C二分查找 C图论 [蓝桥杯 2022 国 A] 环境治理 题目描述 LQ 国拥有 n n n 个城市&#xff0c;从 0 0 0 到 n − 1 n - 1 n−1 编号&#xff0c;这 n n n 个城市两两之间都有且仅有一条双向道路连接&#xff0c;这意味着任意两…

25中医研究生复试面试问题汇总 中医专业知识问题很全! 中医试全流程攻略 中医考研复试调剂真题汇总

各位备考中医研究生的小伙伴们&#xff0c;一想到复试&#xff0c;是不是立刻紧张到不行&#xff0c;担心老师会抛出一大堆刁钻的问题&#xff1f;别怕&#xff01;其实中医复试也是有套路可循的&#xff0c;只要看完这篇攻略&#xff0c;你就会发现复试并没有想象中那么难&…

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

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

使用Jenkins实现Windows服务器下C#应用程序发布

背景 在现代化的软件开发流程中&#xff0c;持续集成和持续部署&#xff08;CI/CD&#xff09;已经成为不可或缺的一部分。 Jenkins作为一款开源的自动化运维工具&#xff0c;能够帮助我们实现这一目标。 本文将详细介绍如何在Windows服务器下使用Jenkins来自动化发布C#应用…

[java基础-JVM篇]1_JVM自动内存管理

JVM内存管理涉及但不限于类加载、对象分配、垃圾回收等&#xff0c;本篇主要记录运行时数据区域与对象相关内容。 内容主要来源《深入理解Java虚拟机&#xff1a;JVM高级特性与最佳实践》与官方文档&#xff0c;理解与表述错漏之处恳请各位大佬指正。 目录 运行时数据区域 栈 栈…

【Linux】vim 设置

【Linux】vim 设置 零、起因 刚学Linux&#xff0c;有时候会重装Linux系统&#xff0c;然后默认的vi不太好用&#xff0c;需要进行一些设置&#xff0c;本文简述如何配置一个好用的vim。 壹、软件安装 sudo apt-get install vim贰、配置路径 对所有用户生效&#xff1a; …

基于Python+django+mysql旅游数据爬虫采集可视化分析推荐系统

2024旅游推荐系统爬虫可视化&#xff08;协同过滤算法&#xff09; 基于Pythondjangomysql旅游数据爬虫采集可视化分析推荐系统 有文档说明 部署文档 视频讲解 ✅️基于用户的协同过滤推荐算法 卖价就是标价~ 项目技术栈 Python语言、Django框架、MySQL数据库、requests网络爬虫…

Oracle 12c Docker安装问题排查 sga_target 1536M is too small

一、问题描述 在虚拟机环境&#xff08;4核16GB内存&#xff09;上部署 truevoly/oracle-12c 容器镜像时&#xff0c;一切运行正常。然而&#xff0c;当在一台 128 核 CPU 和 512GB 内存的物理服务器上运行时&#xff0c;容器启动时出现了 ORA-00821 等错误&#xff0c;提示 S…

es-head(es库-谷歌浏览器插件)

1.下载es-head插件压缩包&#xff0c;并解压缩 2.谷歌浏览器添加插件 3.使用

Linux网络基础(协议 TCP/IP 网络传输基本流程 IP VS Mac Socket编程UDP)

文章目录 一.前言二.协议协议分层分层的好处 OSI七层模型TCP/IP五层(或四层)模型为什么要有TCP/IP协议TCP/IP协议与操作系统的关系(宏观上是如何实现的)什么是协议 三.网络传输基本流程局域网(以太网为例)通信原理MAC地址令牌环网 封装与解包分用 四.IP地址IP VS Mac地址 五.So…

Web开发:ORM框架之使用Freesql的导航属性

一、什么时候用导航属性 看数据库表的对应关系&#xff0c;一对多的时候用比较好&#xff0c;不用多写一个联表实体&#xff0c;而且查询高效 二、为实体配置导航属性 1.给关系是一的父表实体加上&#xff1a; [FreeSql.DataAnnotations.Navigate(nameof(子表.子表关联字段))]…

NLP07-朴素贝叶斯问句分类之数据集加载(1/3)

一、概述 数据集加载&#xff08;Dataset Loading&#xff09;是机器学习、自然语言处理&#xff08;NLP&#xff09;等领域中的一个重要步骤&#xff0c;指的是将外部数据&#xff08;如文件、数据库、网络接口等&#xff09;加载到程序中&#xff0c;以便进行后续处理、分析…

Rk3568驱动开发_点亮led灯(手动挡)_5

1.MMU简介 完成虚拟空间到物理空间的映射 内存保护设立存储器的访问权限&#xff0c;设置虚拟存储空间的缓冲特性 stm32点灯可以直接操作寄存器&#xff0c;但是linux点灯不能直接访问寄存器&#xff0c;linux会使能mmu linux中操作的都是虚拟地址&#xff0c;要想访问物理地…

LangChain构建行业知识库实践:从架构设计到生产部署全指南

文章目录 引言:行业知识库的进化挑战一、系统架构设计1.1 核心组件拓扑1.2 模块化设计原则二、关键技术实现2.1 文档预处理流水线2.2 混合检索增强三、领域适配优化3.1 医学知识图谱融合3.2 检索结果重排序算法四、生产环境部署4.1 性能优化方案4.2 安全防护体系五、评估与调优…

Vscode编辑器:解读文件结构、插件的导入导出、常用快捷键配置技巧及其常见问题的解决方案

一、文件与文件夹结构 1.文件结构 文件名作用.babelrc配置 Babel 编译选项&#xff0c;指定代码转译规则。.editorconfig定义项目代码格式规范&#xff0c;如缩进风格和空格数量等。.eslintignore列出 ESLint 忽略的文件或文件夹。.eslintrc.js配置 ESLint 的规则和插件。.gi…