深入理解设计模式之门面模式

深入理解设计模式之门面模式

什么是门面模式?

门面模式(Facade Pattern)是一种结构型设计模式,它提供了一个简单的接口,用于访问复杂子系统中的一组接口。门面模式通过封装子系统的复杂性,提供了一个更简单、更易于使用的接口给客户端。

  • 门面类:封装了子系统的一组接口,并提供一个简单的接口给客户端使用
  • 子系统类:一个或多个,实现子系统的各个接口和功能

为什么要使用门面模式?

在软件开发中,经常会遇到复杂的系统,其中包含了多个子系统和接口。直接使用这些子系统和接口可能会导致代码的复杂性增加,难以维护和理解。而门面模式可以将这些复杂性隐藏在一个门面类中,提供一个简单的接口给客户端使用。使用门面模式可以带来以下好处:

  1. 简化客户端代码门面模式将复杂的子系统封装起来,客户端只需要与门面类进行交互,不需要了解子系统的复杂性,从而简化了客户端代码
  2. 解耦客户端和子系统门面模式将客户端与子系统之间的耦合度降低,客户端只需要依赖门面类,而不需要直接依赖子系统,从而提高了代码的灵活性和可维护性
  3. 提高代码的可读性门面模式将复杂的子系统封装在一个门面类中,使得代码更加清晰和易于理解

如何使用门面模式?

使用门面模式的步骤如下:

  1. 定义门面类: 创建一个门面类,该类封装了子系统的一组接口,并提供一个简单的接口给客户端使用。
  2. 实现子系统: 实现子系统的各个接口和功能。
  3. 在门面类中调用子系统: 在门面类中调用子系统的接口,将复杂的子系统逻辑封装起来。
  4. 客户端使用门面类: 客户端只需要与门面类进行交互,不需要了解子系统的复杂性。

下面是一个简单的示例代码,演示了如何使用门面模式来简化复杂系统的访问:

案例:我现在要出趟远门,出门前需把所有电器(冰箱、电视、空调…)断电,使用门面模式后我们可以一键将所有电器断电。
在这里插入图片描述

  • 门面类:电闸
  • 子系统:冰箱、电视、空调…
// 子系统类 - 冰箱
class Refrigerator {
    public void turnOff() {
        System.out.println("冰箱已断电");
    }
}

// 子系统类 - 电视
class Television {
    public void turnOff() {
        System.out.println("电视已断电");
    }
}

// 子系统类 - 空调
class AirConditioner {
    public void turnOff() {
        System.out.println("空调已断电");
    }
}

// 门面类 - 门面(Facade)- 相当于电闸
class Facade {
    private Refrigerator refrigerator;
    private Television television;
    private AirConditioner airConditioner;

    public Facade() {
        refrigerator = new Refrigerator();
        television = new Television();
        airConditioner = new AirConditioner();
    }

    public void turnOffAllDevices() {
        refrigerator.turnOff();
        television.turnOff();
        airConditioner.turnOff();
    }
}

客户端

// 客户端代码
public class Client {
    public static void main(String[] args) {
        // 不使用门面模式,一个一个调用,非常麻烦...
        Refrigerator refrigerator = new Refrigerator();
        Television television = new Television();
        AirConditioner airConditioner = new AirConditioner();
        refrigerator.turnOff();
        television.turnOff();
        airConditioner.turnOff();
      
        System.out.println("------------使用门面模式--------------");
  		// 使用门面模式后,一次即可
        Facade facade = new Facade();
        facade.turnOffAllDevices();
    }
}

在这里插入图片描述

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

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

相关文章

华为云hcip核心知识笔记(数据库服务规划)

华为云hcip核心知识笔记(数据库服务规划) 1.云数据接库优势 1.1云数据库优点有: 易用性强:能欧快速部署和运行 高扩展:开放式架构和云计算存储分离 低成本:按需使用,成本更加低廉 2.云数据库r…

Linux下查阅帮助文档必学命令 man

Linux操作系统的使用中,我们经常会遇到很多问题,这个时候查询文档的能力至关重要,黄老师来推荐大家使用man,这时我们必须掌握的查阅能力: 最常用的命令: man 名称 man 数字(1~9) 名称 这里的数字分别代表:

CentOS 搭建 GitLab Git

本文目录 1. CentOS7 搭建 Gitlab1. 安装 sshd1. 安装 sshd 依赖2. 启动并设置开机自启3. 安装防火墙4. 开启防火墙5. 开放 ssh 以及 http 服务 2. 安装 postfix1. 安装 postfix2. 启动并设置开机自启3. 几个补充知识 3. 下载并安装 gitlab1. 在线下载安装包2. 安装 4. 修改 gi…

(学习笔记-内存管理)如何避免预读失效和缓存污染的问题?

传统的LRU算法存在这两个问题: 预读失效 导致的缓存命中率下降缓存污染 导致的缓存命中率下降 Redis的缓存淘汰算法是通过实现LFU算法来避免 [缓存污染] 而导致缓存命中率下降的问题(redis 没有预读机制) Mysql 和 Linux操作系统是通过改进…

node.js的优点

提示:node.js的优点 文章目录 一、什么是node.js二、node.js的特性 一、什么是node.js 提示:什么是node.js? Node.js发布于2009年5月,由Ryan Dahl开发,是一个基于ChromeV8引擎的JavaScript运行环境,使用了一个事件驱…

【云原生】K8S超详细概述

目录 一、Kubernets概述1.1 K8S什么1.2为什么要用K8S 二、Kubernetes 集群架构与组件2.1Master组件Kube-apiserverKube-controller-managerKube-scheduler 2.2 配置存储中心etcd 2.3 Node 组件KubeletKube-Proxydocker 或 rocket 三、 Kubernetes 核心概念3.1Pod3.2Pod 控制器K…

运营商的风控难题该如何破解?

一、运营商难题 01 黑产养卡 这个产业是运营商独有的难题:部分虚拟运营商走线上渠道吸引用户效果不理想,为盲目追求用户数字,便利用线下渠道养卡,即兜售给卡贩子,由此滋生了非实名卡、黑卡等乱象。 “养卡”又称“假…

MATLAB编程实践12、13

生命游戏 游戏的宇宙是无限可扩展的二维矩形网格,群体是那些标注为存活的网格的集合。群体可以依照称为代的离散时间步距进化。在每一步中,每个网格的命运由它周围最近的8个网格邻居的活度决定,规则如下: 如果一个存活的网格有两个…

环形链表 II(JS)

环形链表 II 题目 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,…

单例模式(Singleton)

单例模式保证一个类仅有一个实例,并提供一个全局访问点来访问它,这个类称为单例类。可见,在实现单例模式时,除了保证一个类只能创建一个实例外,还需提供一个全局访问点。 Singleton is a creational design pattern t…

小区智能电动汽车充电桩如何收费盈利?

摘要:智能用电小区是国家电网为了研究智能电网智能用电的先进技术如何运用于居民区,提高人民的生活水平,提高电网智能化水平以及提升用电服务质量而进行的一项尝试。电动汽车作为智能用电小区建设的一个组成部分同样也逐渐被纳入发展规划&…

wireshark导出H264裸流

导出H264裸流 安装wireshark下载rtp_h264_extractor.lua脚本配置lua脚本重启wireshark筛选 安装wireshark 下载抓包工具:首先,您需要下载并安装一个网络抓包工具,例如Wireshark(https://www.wireshark.org)或tcpdump&…

26 用lsqnonlin求解最小二乘问题(matlab程序)

1.简述 函数语法 x lsqnonlin(fun,x0) 函数用于: 解决非线性最小二乘(非线性数据拟合)问题 解决非线性最小二乘曲线拟合问题的形式 变量x的约束上下限为ub和lb, x lsqnonlin(fun,x0)从x0点开始,找到fun中描述的函数的最小平方和。函数fu…

Linux操作系统(一):详解CPU

学习操作系统往往需要先学习CPU相关知识,然后再学习操作系统的结构,主要是因为操作系统是运行在 CPU 上的核心软件,它通过与 CPU 的交互来管理计算机的硬件资源,执行各种系统服务,并为用户和应用程序提供接口和功能。 …

心理测量平台目录遍历

你知道,幸福不仅仅是吃饱穿暖,而是勇敢的战胜困难。 漏洞描述 心理测量平台存在目录遍历漏洞,攻击者可利用该漏洞获取敏感信息。 漏洞复现 访问目录遍历漏洞路径: /admin/漏洞证明: 文笔生疏,措辞浅薄…

Prometheus中的关键设计

1、标准先行,注重生态 Prometheus 最重要的规范就是指标命名方式,数据格式简单易读。比如,对于应用层面的监控,可以要求必须具备这几个信息。 指标名称 metric Prometheus 内置建立的规范就是叫 metric(即 __name__…

clickhouse查询缓存

为了实现最佳性能,数据库需要优化其内部数据存储和处理管道的每一步。但是数据库执行的最好的工作是根本没有完成的工作!缓存是一种特别流行的技术,它通过存储早期计算的结果或远程数据来避免不必要的工作,而访问这些数据的成本往…

Redis以及Java使用Redis

一、Redis的安装 Redis是一个基于内存的 key-value 结构数据库。 基于内存存储,读写性能高 适合存储热点数据(热点商品、资讯、新闻) 企业应用广泛 官网:https://redis.io 中文网:https://www.redis.net.cn/ Redis…

微信小程序监测版本更新

在index.js里面 不放到app.js里面是因为有登录页面,在登录页面显示更新不太友好 onShow() {const updateManager wx.getUpdateManager()// 请求完新版本信息的回调updateManager.onCheckForUpdate(res > {if (res.hasUpdate) {// 新版本下载成功updateManage…

B076-项目实战--宠物上下架 展示 领养 收购订单

目录 上下架功能提供后台宠物列表实现 前台展示前台宠物列表和详情展示店铺展示 领养分析前台后端PetControllerPetServiceImpl 订单需求分析可能产生订单的模块订单模块额外功能 订单设计表设计流程设计 集成基础代码收购订单创建订单前端后端 上下架功能提供 后台宠物列表实…