当前位置: 首页 > news >正文

设计模式-结构型-外观模式

在软件开发中,随着功能的不断迭代,系统会变得越来越复杂,模块之间的依赖关系也会越来越深。这种复杂性会导致代码难以理解、维护和扩展。而外观模式(Facade Pattern)正是为了解决这一问题而生的。

一、外观模式简介

外观模式是一种结构型设计模式,它为子系统中的一组接口提供了一个统一的、更高层次的接口,使得子系统更容易使用。简单来说,外观模式就是为复杂的系统提供一个简单的接口,隐藏系统的复杂性,并提供一个客户端可以访问的入口。

二、外观模式的优点

  • 简化接口: 外观模式将复杂的子系统接口简化为一个更高级别的接口,降低了客户端的理解和使用难度。

  • 提高代码可读性: 通过将复杂的逻辑隐藏在 Facade 类中,可以使客户端代码更加简洁易读。

  • 降低耦合度: 客户端只需要与 Facade 类交互,而不需要直接与子系统中的类交互,降低了系统的耦合度。

  • 提高可维护性: 当子系统发生变化时,只需要修改 Facade 类即可,而不需要修改客户端代码,提高了代码的可维护性。

三、外观模式的应用场景

  • 为复杂的子系统提供一个简单的接口。

  • 当需要将子系统与客户端解耦时。

  • 当需要构建层次结构的子系统时,可以使用外观模式定义每一层的入口点。

四、Python 实现外观模式

假设我们有一个家庭影院系统,包含投影仪、音响、灯光等设备。每次看电影都需要依次打开这些设备,调整设置,非常麻烦。我们可以使用外观模式来简化操作:

# 子系统类
class Projector:def on(self):print("打开投影仪")def off(self):print("关闭投影仪")def set_input(self, source):print(f"设置投影仪输入源为 {source}")class SoundSystem:def on(self):print("打开音响")def off(self):print("关闭音响")def set_volume(self, level):print(f"设置音响音量为 {level}")class Lights:def dim(self, level):print(f"调暗灯光到 {level}%")def off(self):print("关闭灯光")# 外观类
class HomeTheaterFacade:def __init__(self, projector, sound_system, lights):self.projector = projectorself.sound_system = sound_systemself.lights = lightsdef watch_movie(self, movie):print("准备观看电影...")self.lights.dim(10)self.projector.on()self.projector.set_input("Blu-ray")self.sound_system.on()self.sound_system.set_volume(50)print(f"开始播放电影: {movie}")def end_movie(self):print("结束观看电影...")self.projector.off()self.sound_system.off()self.lights.off()# 客户端代码
projector = Projector()
sound_system = SoundSystem()
lights = Lights()home_theater = HomeTheaterFacade(projector, sound_system, lights)home_theater.watch_movie("The Matrix")
print("\n")
home_theater.end_movie()

输出结果:

准备观看电影...
调暗灯光到 10%
打开投影仪
设置投影仪输入源为 Blu-ray
打开音响
设置音响音量为 50
开始播放电影: The Matrix结束观看电影...
关闭投影仪
关闭音响
关闭灯光

五、总结

外观模式通过提供一个统一的接口,简化了复杂系统的使用,降低了客户端与子系统之间的耦合度,提高了代码的可读性和可维护性。在实际开发中,我们可以根据需要使用外观模式来构建更加简洁、易用的系统。

相关文章:

设计模式-结构型-外观模式

在软件开发中,随着功能的不断迭代,系统会变得越来越复杂,模块之间的依赖关系也会越来越深。这种复杂性会导致代码难以理解、维护和扩展。而外观模式(Facade Pattern)正是为了解决这一问题而生的。 一、外观模式简介 …...

8.flask+websocket

http是短连接,无状态的。 websocket是长连接,有状态的。 flask中使用websocket from flask import Flask, request import asyncio import json import time import websockets from threading import Thread from urllib.parse import urlparse, pars…...

ARM Cortex-M3/M4 权威指南 笔记【二】架构

一、架构 1.1 架构简介 Cortex-M3/M4 处理器都基于 ARMv7-M 架构。最初的 ARMv7-M 架构是随着 Cortex-M3 处理器一同引入的,而在 Cortex-M4 发布时,架构中又额外增加了新的指令和特性,改进后的架构有时也被称为 ARMV7E-M。要了解 ARM7-M 和…...

HCIA项目实践--静态路由的拓展配置

7.7 静态路由的拓展配置 网络中的两个重要思想: (1) 实的不行来虚的; (2) 范围太大,划分范围。(分治) 7.7.1 负载均衡 (1)定义 负载均衡是一种网…...

STL中list的模拟实现

文章目录 1. 前言and框架2. 相对完整的框架3. 模拟实现接口1. 迭代器的引入2. 迭代器的区分list迭代器迭代器的构造list迭代器的实现模拟指针解引用前置和前置--后置和--迭代器!迭代器-> list的const迭代器迭代器模板迭代器是否需要析构,拷贝构造&…...

计算机网络知识速记:HTTP1.0和HTTP1.1

计算机网络知识速记:HTTP1.0和HTTP1.1 1. 基本概念 1.1 HTTP1.0 HTTP1.0是1996年发布的第一个正式版本,主要用于客户端与服务器之间的简单请求和响应交互。它的设计理念相对简单,适合处理一些基本的网页服务。 1.2 HTTP1.1 HTTP1.1是HTT…...

Apache Kafka 中的认证、鉴权原理与应用

编辑导读:本篇内容将进一步介绍 Kafka 中的认证、鉴权等概念。AutoMQ 是与 Apache Kafka 100% 完全兼容的新一代 Kafka,可以帮助用户降低 90%以上的 Kafka 成本并且进行极速地自动弹性。作为 Kafka 生态的忠实拥护者,我们也会持续致力于传播 …...

DeepSeek自然语言处理(NLP)基础与实践

自然语言处理(Natural Language Processing, NLP)是人工智能领域的一个重要分支,专注于让计算机理解、生成和处理人类语言。NLP技术广泛应用于机器翻译、情感分析、文本分类、问答系统等场景。DeepSeek提供了强大的工具和API,帮助我们高效地构建和训练NLP模型。本文将详细介…...

激光工控机在精密制造中的应用与优势

在精密制造中,激光工控机可以用于许多场景例如 激光切割与雕刻:用于金属、塑料、陶瓷等材料的精密切割和雕刻,适用于汽车、航空航天、电子等行业;可实现复杂图案和高精度加工,满足微米级精度要求。 激光焊接&#xf…...

Docker换源加速(更换镜像源)详细教程(2025.2最新可用镜像,全网最详细)

文章目录 前言可用镜像源汇总换源方法1-临时换源换源方法2-永久换源(推荐)常见问题及对应解决方案1.换源后,可以成功pull,但是search会出错 补充1.如何测试镜像源是否可用2.Docker内的Linux换源教程 换源速通版(可以直…...

12.14 算法练习

1. 每日温度 算法思路 1. 单调栈的作用:记录我们遍历过的元素,与当前的元素方便对比,本质是以空间换时间; 2. 比较当前元素与栈顶元素的大小,当当前元素大于栈顶元素时,持续弹出栈顶元素下标,…...

ASP.NET Core SignalR的分布式部署

假设聊天室程序被部署在两台服务器上,客户端1、2连接到了服务器A上的ChatRoomHub,客户端3、4连接到服务器B上的ChatRoomHub,那么客户端1发送群聊消息时,只有客户端1、2能够收到,客户端3、4收不到;在客户端3…...

Express 中间件

在构建 Web 应用程序时,中间件(Middleware)扮演着至关重要的角色。它允许你定义一系列的函数来处理 HTTP 请求和响应过程中的各种任务。Express.js 是 Node.js 上最流行的框架之一,以其简洁且强大的中间件机制著称。本文将深入探讨…...

ABB能源自动化选用宏集Cogent DataHub避免DCOM问题,实现高效、安全的数据传输

案例概况 ABB能源自动化公司通过宏集Cogent DataHub软件将电厂设施的数据实时传输到公司办公室,实现了OPC隧道/镜像解决方案,在电厂和公司网络之间建立了一个安全、可靠的连接,确保数据传输的高度安全,减少入侵风险。 &#xff0…...

springboot239-springboot在线医疗问答平台(源码+论文+PPT+部署讲解等)

💕💕作者: 爱笑学姐 💕💕个人简介:十年Java,Python美女程序员一枚,精通计算机专业前后端各类框架。 💕💕各类成品Java毕设 。javaweb,ssm&#xf…...

【Elasticsearch】分析器的构成

在Elasticsearch中,分析器(Analyzer)是一个处理文本数据的管道,它将输入的文本转换为一系列词元(tokens),并可以对这些词元进行进一步的处理和规范化。分析器由以下三个主要组件构成&#xff1a…...

Python 调用 Azure OpenAI API

在人工智能和机器学习快速发展的今天,Azure OpenAI 服务为开发者提供了强大的工具来集成先进的 AI 能力到他们的应用中。本文将指导您如何使用 Python 调用 Azure OpenAI API,特别是使用 GPT-4 模型进行对话生成。 准备工作 在开始之前,请确保您已经: 拥有一个 Azure 账户…...

数据结构 算法时间复杂度和空间复杂度

一、算法好坏的度量 【事前分析法】 算法设计好后,根据算法的设计原理,只要问题规模确定,算法中基本语句执⾏次数和需求资源个数 基本也就确定了。 ⽐如求1 2 3 ... n − 1 n ,可以设计三种算法: 算法A&#xff…...

CNN-BiGRU卷积神经网络双向门控循环单元多变量多步预测,光伏功率预测

CNN-BiGRU卷积神经网络双向门控循环单元多变量多步预测,光伏功率预测 代码下载:CNN-BiGRU卷积神经网络双向门控循环单元多变量多步预测,光伏功率预测 一、引言 1.1、研究背景及意义 随着全球能源危机和环境问题的日益严重,可再…...

钉钉位置偏移解决,钉钉虚拟定位打卡

虚拟定位打卡工具 一,介绍免费获取工具 一,介绍 提到上班打卡,职场人的内心戏估计能拍成一部连续剧。打卡,这俩字仿佛自带“紧箍咒”,让无数打工人又爱又恨。想象一下,你气喘吁吁地冲进办公室,…...

设计模式——中介者设计模式(行为型)

摘要 文章详细介绍了中介者设计模式,这是一种行为型设计模式,通过中介者对象封装多个对象间的交互,降低系统耦合度。文中阐述了其核心角色、优缺点、适用场景,并通过类图、时序图、实现方式、实战示例等多方面进行讲解&#xff0…...

分布式锁优化:使用Lua脚本保证释放锁的原子性问题

分布式锁优化(二):使用Lua脚本保证释放锁的原子性问题 💻黑马视频链接:Lua脚本解决多条命令原子性问题 在上一章节视频实现了一个可用的Redis分布式锁,采用SET NX EX命令实现互斥和过期自动释放机制&…...

电脑wifi显示已禁用怎么点都无法启用

一、重启路由器与电脑 有时候,简单的重启可以解决很多小故障。试着先断开电源让路由器休息一会儿再接通;对于电脑,则可选择重启系统看看情况是否有改善。 二、检查驱动程序 无线网卡驱动程序的问题也是导致WiFi无法启用的常见原因之一。我…...

【Docker 从入门到实战全攻略(一):核心概念 + 命令详解 + 部署案例】

1. 是什么 Docker 是一个用于开发、部署和运行应用程序的开源平台,它使用 容器化技术 将应用及其依赖打包成独立的容器,确保应用在不同环境中一致运行。 2. Docker与虚拟机 2.1 Docker(容器化) 容器化是一种轻量级的虚拟化技术…...

精益数据分析(92/126):指标基准化——如何判断你的数据表现是否足够优秀

精益数据分析(92/126):指标基准化——如何判断你的数据表现是否足够优秀 在创业过程中,面对纷繁复杂的指标数据,创业者常常困惑于“什么样的表现算优秀”“我的数据是否达标”。今天,我们将通过WP Engine的…...

企业级应用狂潮:从Spotify到LinkedIn的Llama实战手册

当Spotify用Llama生成的个性化推荐文案让用户播放时长激增30%, 当LinkedIn靠开源框架将社交推荐延迟降低40%—— 企业级AI战场正经历从“技术炫技”到“利润引擎”的残酷蜕变。 核心数据:企业采用率爆发式增长(2025 Gartner调研) 指标2023年2025年增幅开源模型采用率42%87%…...

CSS强制div单行显示不换行

在CSS中&#xff0c;要让<div>的内容强制单行显示且不换行&#xff0c;可通过以下属性组合实现&#xff1a; 核心解决方案&#xff1a; css 复制 下载 div {white-space: nowrap; /* 禁止文本换行 */overflow: hidden; /* 隐藏溢出内容 */text-overflow: e…...

【从零开始学习QT】Qt 概述

目录 一、什么是 Qt 1.1 简介 1.2 Qt 的发展史 1.3 Qt 支持的平台 1.5 Qt 的优点 1.6 Qt 的应用场景 二、搭建 Qt 开发环境 2.1 Qt SDK 的下载 2.2 Qt SDK 的安装 2.3 验证 Qt SDK 安装是否成功 2.4 Qt 环境变量配置 三、认识 Qt Creator 3.1 Qt Creator 概览 3.…...

第2篇:数据库连接池原理与自定义连接池开发实践

2.1 什么是数据库连接池&#xff1f; 数据库连接池&#xff08;Connection Pool&#xff09;是一种用于管理数据库连接对象的复用机制。它的主要目标是&#xff1a; 减少频繁创建/销毁连接的开销 提高系统对数据库资源的使用效率 支持连接复用、并发控制和连接健康检查 连接…...

C#项目07-二维数组的随机创建

实现需求 创建二维数组&#xff0c;数组的列和宽为随机&#xff0c;数组内的数也是随机 知识点 1、Random类 Public Random rd new Random(); int Num_Int rd.Next(1, 100);2、数组上下限。 //定义数组 int[] G_Array new int[1,2,3,4];//一维数组 int[,] G_Array_T …...