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

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

什么是门面模式?

门面模式(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();}
}

在这里插入图片描述

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

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

相关文章

809协议服务端程序解码程序

809协议服务端程序解码程序 目录概述需求: 设计思路实现思路分析1.服务端2.code: 拓展实现性能参数测试:1.功能测试 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip…

easyui主表子表维护页面

easyui主表子表维护页面 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>Title</title><!-- <#include "common.html"/> --><link rel"stylesheet" type&quo…

释放三年版本:Aspose.Total For NET [21.7/22.7/23.7]

请各位对号入座&#xff0c;选择自己需求范围&#xff0c;你懂的&#xff0c;你懂的&#xff0c;你懂的 Aspose.Total for .NET is the most complete package of all .NET File Format Automation APIs offered by Aspose. It empowers developers to create, edit, render, …

tinkerCAD案例:29. New: Cruising with Shapes 新功能:与形状一起Cruising

tinkerCAD案例&#xff1a;29. New: Cruising with Shapes 新功能&#xff1a;与形状一起Cruising 原文&#xff1a;有动图演示 Stacking and assembling shapes has never been easier with Tinkercad’s new Cruise tool! 使用Tinkercad的Cruising工具堆叠和组装形状从未如…

会议OA系统会议管理模块开发思路(layui搭建)

目录 一.为什么要进行开发 1.开发目的 2.项目流程 A.发起会议请求过程 1.首先实现我们的多选下拉框功能&#xff01; 2.时间组件功能&#xff0c;并且提交我们新增加的会议内容 3.在进行发起会议编码时遇到的问题&#xff0c;BUG 3.1.有点时候js访问不到路径 3.2在增加…

高级 IO

目录 前言 什么是IO&#xff1f; 有哪些IO的的方式呢&#xff1f; 五种IO模型 这五种模型在特性有什么差别呢&#xff1f; 其他高级IO 非阻塞IO fcntl 实现函数SetNonBlock I/O多路转接之select 初识select select函数 参数说明&#xff1a; 关于timeval结构 函数…

通过一次线上问题,讲下Ribbon重试机制

前言 前段时间&#xff0c;产品经理在线上验证产品功能的时候&#xff0c;发现某个功能不符合需求预期&#xff0c;后来测试验证发现是服务端的一个接口大概率偶现超时&#xff0c;前端做了兜底处理&#xff0c;所以对线上用户么有太大影响。 问题排查过程 由于服务端的接口…

Linux——总复习2

1.配置用户更改密码 &#xff08;1&#xff09;强制在其第一次登录时更改密码&#xff1a;chage -d 0 user &#xff08;2&#xff09;将用户密码的最短期限设置为10天&#xff1a;chage -m 10 user &#xff08;3&#xff09;将用户密码的最长期限设置为30天&#xff1a;ch…

测试平台——项目工程创建和配置

这里写目录标题 一、配置开发环境二、配置MySql数据库三、配置工程日志 一、配置开发环境 项目的环境分为开发环境和生产环境。 开发环境:用于编写和调试项目代码。 生产环境:用于项目线上部署运行。 base.py 修改BASE_DIR&#xff1a;拼接.parent 原因&#xff1a;原BASE_D…

如何评判算法好坏?复杂度深度解析

如何评判算法好坏&#xff1f;复杂度深度解析 1. 算法效率1.1 如何衡量一个算法好坏1.2 算法的复杂度 2 时间复杂度2.1 时间复杂度的概念2.1.1 实例 2.2 大O的渐进表示法2.3 常见时间复杂度计算举例 3 空间复杂度4 常见复杂度对比5 结尾 1. 算法效率 1.1 如何衡量一个算法好坏 …

shell脚本练习--安全封堵脚本,使用firewalld实现

一.什么是安全封堵 安全封堵&#xff08;security hardening&#xff09;是指采取一系列措施来增强系统的安全性&#xff0c;防止潜在的攻击和漏洞利用。以下是一些常见的安全封堵措施&#xff1a; 更新和修补系统&#xff1a;定期更新操作系统和软件包以获取最新的安全补丁和修…

【机器学习】分类算法 - 朴素贝叶斯 MultinomialNB

朴素贝叶斯 1、朴素贝叶斯API2、朴素贝叶斯算法实际应用2.1、获取数据集2.2、划分数据集2.3、特征归一化2.4、贝叶斯算法处理并评估 3、常见问题 朴素贝叶斯法&#xff08;Naive Bayes model 简称 NBM &#xff09;是基于「贝叶斯定理」与「特征条件独立假设」的分类方法。 「…

「JVM」Full GC和Minor GC、Major GC

Full GC和Minor GC、Major GC 一、Full GC1、什么是Full GC?2、什么情况下会触发full gc&#xff1f; 二、Minor GC1、什么是Minor GC&#xff1f;2、什么情况下会触发Minor GC&#xff1f; 三、Major GC1、什么是Major GC&#xff1f;2、什么情况下会触发Major GC&#xff1f…

Android开发初体验

创建项目geoquiz 选择EmptyActivity 编程语言选择Kotlin 修改app/src/main/java/MainActivity.kt package com.bignerdranch.android.geoquizimport androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.View import android.widget.*cl…

Vue.js高阶学习和常用知识(二)

目录 1. Vue 实例2. 组件3. 指令4. 计算属性5. 监听器6. 生命周期钩子 Vue.js 是一个流行的 Web 前端框架&#xff0c;它由 Evan You 于 2014 年创建。Vue.js 的设计目标是简单、灵活和易于使用&#xff0c;同时具有高性能和可扩展性。 Vue.js 基于组件化的思想&#xff0c;将页…

Java并发系列之一:JVM线程模型

什么是线程模型&#xff1a; Java字节码运行在JVM中&#xff0c;JVM运行在各个操作系统上。所以当JVM想要进行线程创建回收这种操作时&#xff0c;势必需要调用操作系统的相关接口。也就是说&#xff0c;JVM线程与操作系统线程之间存在着某种映射关系&#xff0c;这两种不同维…

在OK3588板卡上部署模型实现OCR应用

一、主机模型转换 我们依旧采用FastDeploy来部署应用深度学习模型到OK3588板卡上 进入主机Ubuntu的虚拟环境 conda activate ok3588 安装rknn-toolkit2&#xff08;该工具不能在OK3588板卡上完成模型转换&#xff09; git clone https://github.com/rockchip-linux/rknn-to…

通过performance分析mysql内存占用

在 MySQL 使用过程中&#xff0c;偶尔会出现OOM、内存异常突增等异常现象。为了排查内存异常&#xff0c;我们需要分析内存占用情况&#xff0c;找出内存占用的具体事件。我们可以从以下几张performance下的表分析内存&#xff0c;每张表对应不同的维度&#xff0c;有用户维度、…

基于Java+spring+springMvc+mybatis+jsp学生选课管理系统

基于JavaspringspringMvcmybatisjsp学生选课管理系统 一、系统介绍二、功能展示1.课程列表(学生)2.已选课程(学生)3.已修课程(学生)4.我的课程&#xff08;老师&#xff09;5.课程打分&#xff08;老师&#xff09;6.课程管理、学生管理、教师管理&#xff08;系统管理员&#…

stm32读取DHT11温湿度传感器

stm32读取DHT11温湿度传感器 一.序言二.DHT11响应数据格式三.DHT11通讯过程3.1 产生起始信号3.2 读取数据03.3 读取数据1DHT11停止信号 四.代码实例4.1读取DHT11源文件4.2 读取DHT11头文件 五.结语5.1 总结整体思路5.2 对读者的期望 一.序言 我们知道DHT11是单总线协议&#x…