秒懂设计模式--学习笔记(7)【结构型-门面模式】

news2024/11/16 6:59:35

目录

      • 6、门面模式
          • 6.1 介绍
          • 6.2 一键操作
          • 6.3 亲自下厨的烦扰
          • 6.4 化繁为简
          • 6.5 整合共享
          • 6.6 门面模式的各角色定义

6、门面模式

6.1 介绍
  • 门面模式(Facade)可能是最简单的结构型设计模式
  • 它能将多个不同的子系统接口封装起来,并对外提供统一的高层接口,使复杂的子系统变得更易使用
  • 无论是“门”还是“面”,指代的都是某系统的外观部分,也就是与外界接触的临界面或接口,所以门面模式常常也被翻译为“外观模式”
  • 测试类文件
    门面模式测试类文件
6.2 一键操作
  • 如相机使用对焦、调节闪光灯、调光圈等
  • 对庞大复杂的子系统进行了二次封装,把原本复杂的操作接口全都隐藏起来,并在内部加入逻辑
  • 最终只为外界提供一个简单方便的快门按键,让用户能够“一键操作”
6.3 亲自下厨的烦扰
  • 门面模式,那么以“商铺门面”的例子进行代码实战
  • 亲自下厨需要买菜、洗菜、切菜,然后进行蒸、煮、炒、炸等烹饪过程,最后清理碗筷等
  • 将步骤简化为以下3步,首先小明找菜贩买菜,然后找妹妹做菜,最后亲自洗碗
    • 第1步: 定义蔬菜商类
    • 第2步: 让妹妹作为厨房小能手类
    • 第3步: 最后小明作为客户端类进行全局操控并
package facade.base;

/**
 * 蔬菜商类
 **/
public class VegVendor {
    public void purchase() {
        System.out.println("供应蔬菜……");
    }
}
package facade.base;

/**
 * 厨房小能手类
 **/
public class Helper {
    public void cook() {
        System.out.println("做饭……");
    }
}
package facade.base;

/**
 * 客户端测试类
 **/
public class Client {
    public static void main(String[] args) {
        // 找商贩买菜
        VegVendor vegVendor = new VegVendor();
        vegVendor.purchase();

        // 找妹妹做饭
        Helper helper = new Helper();
        helper.cook();

        // 吃饭
        Client client = new Client();
        client.eat();
        // 洗碗
        client.wash();
    }

    public void eat() {
        System.out.println("开始吃饭......");
    }

    public void wash() {
        System.out.println("洗碗.......");
    }
}

  • 一系列复杂的操作过程并不像我们想象的那么简单
  • 不但惊扰四方,还要自己亲自擦桌洗碗,但无论换作谁都要经历这一番操作
6.4 化繁为简
  • 门店(饭店)为了达到高效、便捷的目的,门店会统一对子系统进行整合与调度,至于它对蔬菜商、厨师或服务员等子系统是如何操作的,用户都不必了解
  • 子系统
package facade.facade.entity;

/**
 *  蔬菜商类
 **/
public class VegVendor {
    public void purchase() {
        System.out.println("供应蔬菜……");
    }
}
package facade.facade.entity;

/**
 * 厨师
 **/
public class Chef {
    public void cook() {
        System.out.println("厨师做饭......");
    }
}
package facade.facade.entity;

/**
 * 服务员
 **/
public class Waiter {
    public void order() {
        System.out.println("接待,入座,点菜......");
    }
    public void serve() {
        System.out.println("服务员上菜......");
    }
}
package facade.facade.entity;

/**
 *  清洁洗碗工
 **/
public class Cleaner {
    public void clean(){
        System.out.println("清洁收拾桌子......");
    }
    public void wash() {
        System.out.println("清洁洗碗......");
    }
}
  • 外观门面类Facade:
    • 内部封装了大量的子系统资源, 如蔬菜商、厨师、服务员、洗碗工
    • 构造方法中依次对各个子系统进行了初始化操作
    • 点菜方法order()中进行依次调度
package facade.facade;

import facade.base.VegVendor;
import facade.facade.entity.Chef;
import facade.facade.entity.Cleaner;
import facade.facade.entity.Waiter;

/**
 * 外观门面类: 内部封装了大量的子系统资源
 **/
public class Facade {

    private VegVendor vegVendor;
    private Chef chef;
    private Waiter wait;
    private Cleaner clean;

    public Facade() {
        this.vegVendor = new VegVendor();
        // 开门前就找蔬菜商准备好蔬菜
        vegVendor.purchase();

        // 雇佣厨师
        this.chef = new Chef();
        // 雇佣服务员
        this.wait = new Waiter();
        // 雇佣清洁工、洗碗工等
        this.clean = new Cleaner();
    }

    public void order(){
        // 接待,入座,点菜
        wait.order();

        // 找厨师做饭
        chef.cook();

        // 上菜
        wait.serve();

        // 收拾桌子,洗碗,以及其他操作
        clean.clean();
        clean.wash();
    }
}
  • 用户要做的只是登门访问,调用其order()方法即可享受现成可口的饭菜了,操作变得简单而优雅。
6.5 整合共享
  • 软件模块应该只专注于各自擅长的领域,合理明确的分工模式才能更好地整合与共享资源
  • 外观门面类对子系统的整合与共享极大地保证了用户访问的便利性
6.6 门面模式的各角色定义
  • Facade(外观门面):封装了多个子系统,并将它们整合起来对外提供统一的访问接口
  • SubSystemA、SubSystemB(子系统A、子系统B…):隐藏于门面中的子系统,数量任意,且对外部不可见,专注于各自擅长的领域。如:蔬菜商类、厨师类、服务员类等
  • Client(客户端):门面系统的使用方,只访问门面提供的接口。
  • 门面充当了包装类的角色,对子系统进行整合,再对外暴露统一接口,使其结构内繁外简,最终达到资源共享、简化操作的目的
  • 从另一方面讲,门面模式也降低了客户端与子系统之间的依赖度,高内聚才能低耦合。

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

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

相关文章

2024年用scrapy爬取BOSS直聘的操作

SCrapy框架实现对BOSS直聘的爬取 文章目录 SCrapy框架实现对BOSS直聘的爬取对SCrapy框架的一个简单认识Scrapy 组件的作用Scrapy 数据流 1. 测试反爬2. 定义一个下载中间件类,截取spiders的请求(中间件直接截取请求,并且返回给Spider进行数据解析&#x…

文件扫描pdf怎么弄?5个简易高效的文件扫描方法

在繁忙的工作中,我们常常需要将纸质文件快速转换为电子文档,以便于编辑、存储或分享。 无论是合同、报告还是笔记,将这些纸质文件转换为Word格式,不仅能提高工作效率,还能确保信息的安全备份。然而,面对市…

【LLM大模型】中国人工智能大模型技术白皮书,从0入门大模型,附文档+LLM实战教程

近期,中国人工智能学会发布了《中国人工智能大模型技术白皮书》,系统梳理了大模型技术演进,深入探讨关键技术要素,并剖析当前挑战及未来展望。 我为大家做了简要总结,并附上文档分享给大家。 PDF: 完整版本…

Git 操作总结

1. 安装、Git 环境配置 1.1 安装 Git 官方版本可以在 Git 官方网站下载:打开 https://git-scm.com/download/win,选择相应版本即可。 Git 安装完成后,可以在开始菜单中看到 Git 的三个启动图标(Git Bash、Git CMD、Git GUI&…

最新mysql打开远程访问和修改最大连接数

这里写目录标题 1.使用navicat进入命令控制板,进入use mysql;2.查询用户表3.更新user表中root用户域属性,%表示允许外部访问4.执行以上语句之后再执行,FLUSH PRIVILEGES;5. 执行授权语句修改最大连接数 1.使用navicat进入命令控制板,进入use mysql; use…

成都百洲文化传媒有限公司电商服务的佼佼者

在当今这个数字化时代,电商已成为商业发展的核心动力之一。成都百洲文化传媒有限公司,作为一家专注于电商服务的领先企业,正以其卓越的服务质量和前瞻性的战略眼光,引领着电商行业的新潮流。 一、公司简介 成都百洲文化传媒有限公…

SF-HCI-SAP问题收集17:值映射布尔型EC数据

Complacency is the enemy of study 学习的敌人是自己的满足。 SAP SuccessFactors Employee Central 到 SAP ERP 的员工主数据复制 successfactor employee center主数据同步,一直以来排错比较难,难的地方是这个提示消息比较隐晦,而且同步的…

解决 Layout Inspector无法查看Component Tree 布局层级信息 | Android Studio Koala

问题描述 Tool -> Layout Inspector 显示下图,无法生成.li文件查看Component Tree,变成实时的Preview并功能点击操作,跟模拟器一样。 原因:默认勾选了"Enable embedded Layout Inspector",启用了嵌入式…

Qualcomm QCS6490 开发板运行高通AI HUB图像分类程序

相关代码可以在如下链接下载: ai-hub-models/apps/android/ImageClassification at main quic/ai-hub-models GitHub 所用硬件有: 1. UBUNTU20.04 2. 高通QCS6490 开发板 对下载下来的代码进行编译 1.ubuntu环境配置 1.python环境配置 如果你的…

昇思25天学习打卡营第8天|模型权重与 MindIR 的保存加载

目录 导入Python 库和模块 创建神经网络模型 保存和加载模型权重 保存和加载MindIR 导入Python 库和模块 上一章节着重阐述了怎样对超参数予以调整,以及如何开展网络模型的训练工作。在网络模型训练的整个进程当中,事实上我们满怀期望能够留存中间阶段…

python基础语法 004-3流程控制- while

1 while while 主要用的场景没有 for 循环多。 while循环&#xff1a;主要运行场景 我不知道什么时候结束。。。不知道运行多少次 1.1 基本用法 # while 4 > 3: #一直执行 # print("hell0")while 4 < 3: #不会打印&#xff0c;什么都没有print("…

go开源webssh终端源码main.go分析

1.地址: https://github.com/Jrohy/webssh.git 2.添加中文注释地址: https://github.com/tonyimax/webssh_cn.git main.go分析 主包名&#xff1a;main package main //主包名 依赖包加载 //导入依赖包 import ("embed" //可执行文件…

【Qwen2部署实战】探索Qwen2-7B:通过FastApi框架实现API的部署与调用

系列篇章&#x1f4a5; No.文章1【Qwen部署实战】探索Qwen-7B-Chat&#xff1a;阿里云大型语言模型的对话实践2【Qwen2部署实战】Qwen2初体验&#xff1a;用Transformers打造智能聊天机器人3【Qwen2部署实战】探索Qwen2-7B&#xff1a;通过FastApi框架实现API的部署与调用4【Q…

springboot双学位招生管理系统-计算机毕业设计源码93054

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作…

松下Panasonic机器人维修故障原因

松下机器人伺服电机是许多工业自动化设备的关键组成部分。了解如何进行Panasonic工业机械臂电机维修&#xff0c;对于确保设备正常运行至关重要。 【松下焊接机器人维修案例】【松下机器人维修故障排查】 一、常见松下工业机械手伺服电机故障及原因 1. 过热&#xff1a;过热可…

Webpack: 并行构建

概述 受限于 Node.js 的单线程架构&#xff0c;原生 Webpack 对所有资源文件做的所有解析、转译、合并操作本质上都是在同一个线程内串行执行&#xff0c;CPU 利用率极低&#xff0c;因此&#xff0c;理所当然地&#xff0c;社区出现了一些以多进程方式运行 Webpack&#xff0…

铜排载流量计算

母线载流量的理论计算 有些设计规范给出了根据电流密度确定母线大小的标准&#xff0c;一般铜母线的要求是每平方毫米载流量1.55A&#xff0c;但只可以作为设计“自由空气中的单导体母线”的参考&#xff0c;不可以作为实际设备中选择母线截面积的方法。也有些设计手册里给出了…

无线领夹麦克风选什么价位,揭秘无线领夹麦克风哪个品牌音质最好

在自媒体的快速发展之下&#xff0c;越来越多人加入到短视频拍摄行业。当我们踏出户外&#xff0c;想要用声音记录美好生活时&#xff0c;一个优质的麦克风便成了不可或缺的装备。户外环境的喧嚣与手机麦克风的局限性常常让我们的声音淹没在背景噪音之中&#xff0c;使得同期录…

小白也能看懂的Python基础教程(8)

Python面向对象 目录 Python面向对象 一、面向对象的概念 1、常见的编程思想 2、面向过程是什么&#xff1f; 3、什么是面向对象&#xff1f; 4、封装 5、继承 6、多态 二、面向对象的概念 1、两个重要概念 2、类 3、对象 4、self关键字 三、对象属性 1、什么…

昇思25天学习打卡营第8天|MindSpore保存与加载(保存和加载MindIR)

在MindIR中&#xff0c;一个函数图&#xff08;FuncGraph&#xff09;表示一个普通函数的定义&#xff0c;函数图一般由ParameterNode、ValueNode和CNode组成有向无环图&#xff0c;可以清晰地表达出从参数到返回值的计算过程。在上图中可以看出&#xff0c;python代码中两个函…