【Python笔记-设计模式】外观模式

一、说明

外观模式是一种结构型设计模式,能为程序库、框架或其他复杂类提供一个统一的接口。

(一) 解决问题

简化复杂系统的接口调用

(二) 使用场景

  • 简化复杂系统:需要一个指向复杂子系统的直接接口, 且该接口的功能有限时
  • 重构复杂的代码:当系统中存在复杂的代码结构,并且需要重构时,可以使用外观模式来重新设计接口,使得系统更易于理解和维护。
  • 遗留系统的封装:对于遗留系统,可能存在复杂的接口和实现细节,可以使用外观模式来封装这些细节,提供更简单的接口给新系统使用。

二、结构

  1. 外观(Facade)提供了一种访问特定子系统功能的便捷方式,其了解如何重定向客户端请求,知晓如何操作一切活动部件。
  2. 创建附加外观(Additional Facade)类可以避免多种不相关的功能污染单一外观,使其变成又一个复杂结构。客户端和其他外观都可使用附加外观。
  3. 复杂子系统(Complex Subsystem)由数十个不同对象构成。如果要用这些对象完成有意义的工作,你必须深入了解子系统的实现细节,比如按照正确顺序初始化对象和为其提供正确格式的数据。子系统类不会意识到外观的存在,它们在系统内运作并且相互之间可直接进行交互。
  4. 客户端(Client)使用外观代替对子系统对象的直接调用。

三、伪代码

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__doc__ = """
外观模式例:家庭影院系统,包含多个子系统,如投影仪、灯光、屏幕等。通过外观类,客户端只需关注 打开/关闭观影模式,无需关注内部子系统细节。
"""class Projector:"""子系统类 - 投影仪"""def on(self):print("- 投影仪开启")def off(self):print("- 投影仪关闭")def play(self):print("- 投影仪播放影片")class Lights:"""子系统类 - 灯光"""def dim(self):print("- 灯光调暗")def brighten(self):print("- 灯光调亮")class AudioSystem:"""子系统类 - 音响"""def on(self):print("- 音响开启")def off(self):print("- 音响关闭")def play(self):print("- 音响播放音乐")class HomeTheaterFacade:"""外观类 - 家庭影院外观"""def __init__(self):self.projector = Projector()self.lights = Lights()self.audio_system = AudioSystem()def watch_movie(self):self.projector.on()self.lights.dim()self.audio_system.on()self.projector.play()def end_movie(self):self.projector.off()self.lights.brighten()self.audio_system.off()if __name__ == "__main__":"""打开观影模式...- 投影仪开启- 灯光调暗- 音响开启- 投影仪播放影片关闭观影模式...- 投影仪关闭- 灯光调亮- 音响关闭"""home_theater = HomeTheaterFacade()print("打开观影模式...")home_theater.watch_movie()print()print("关闭观影模式...")home_theater.end_movie()

四、优缺点

优点

  • 简化接口:外观模式提供了一个统一的接口,隐藏了系统的复杂性,使得客户端更容易使用系统。
  • 提高安全性:外观模式可以将复杂的操作封装起来,对外只暴露简单的接口,提高了系统的安全性。

缺点

  • 不符合开闭原则:外观模式在添加新的子系统或者修改子系统时,可能需要修改外观类,不符合开闭原则。

 跳转主页:【Python笔记】设计模式-CSDN博客

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

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

相关文章

unity ui界面优化

优化一个比较复杂的界面,里面有多个rt和组件。 在初次打开这个界面的时候会发生1s多的卡顿,还是非常严重的。 分析 通过profiler分析 1.打开界面时卡顿。 分析:除了update和dotween相关逻辑,主要在于打开时的lua function调用…

幻兽帕鲁(Palworld 1.4.1)私有服务器搭建(docker版)

文章目录 说明客户端安装服务器部署1Panel安装和配置docker服务初始化设置设置开机自启动设置镜像加速 游戏服务端部署游戏服务端参数可视化配置 Palworld连接服务器问题总结 说明 服务器硬件要求:Linux系统/Window系统(x86架构,armbian架构…

[程序员] sipp运行时socket接收队列持续满载 - 文件系统访问慢

​今天谈一下,最近和同事一块看到的一个例子,说sipp运行时的某一时刻之后,总是会有408/487/retrans,通过netstat看,还总是会出现接收队列满载的情况。如下netstat的输出,137472是接收队列的缓存的数据量: udp 131072 0 100.103.238.11:5060 0.0.0.0:* 20175/sipp.lates…

spring boot3登录开发-3(账密登录逻辑实现)

⛰️个人主页: 蒾酒 🔥系列专栏:《spring boot实战》 🌊山高路远,行路漫漫,终有归途。 目录 前置条件 内容简介 用户登录逻辑实现 创建交互对象 1.创建用户登录DTO 2.创建用户登录VO 创建自定义登录业务异…

K8S简单学习

目录 安装启动第一个服务启动k8s看板暴露服务查看services自动打开服务查看pods 官方的文档 安装 centos8安装记录 pod和deployment的关系 启动第一个服务 通过deployment的方式进行创建 kubectl create deployment hello-nginx --imagenginx:latest --port8080启动k8s看板…

如何使用ChatGPT创建一份优质简历

目录 第一步:明确目标和重点 第二步:与ChatGPT建立对话 第三步:整理生成的内容 第四步:注重行文风格 第五步:强调成就和量化结果 第六步:个性化和定制 第七步:反复修改和完善 总结 在现…

分类预测 | Matlab实现KPCA-ISSA-LSSVM基于核主成分分析和改进的麻雀搜索算法优化最小二乘支持向量机故障诊断分类预测

分类预测 | Matlab实现KPCA-ISSA-LSSVM基于核主成分分析和改进的麻雀搜索算法优化最小二乘支持向量机故障诊断分类预测 目录 分类预测 | Matlab实现KPCA-ISSA-LSSVM基于核主成分分析和改进的麻雀搜索算法优化最小二乘支持向量机故障诊断分类预测分类效果基本描述程序设计参考资…

【软件测试】定位前后端bug总结+Web/APP测试分析

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、Web测试中简单…

爬虫项目(下)

1..string 属性是用来获取节点中标签内容。 for content in content_all:contentString content.stringprint(contentString) .string 属性只能提取单个节点或节点统一的内容。 提取节点包含多个子节点时:使用这个属性时,不清楚应该调用哪个节点的内容&#xff…

k8s-pod的介绍及命令行创建pod

一、 pod介绍 在kubernetes的世界中,k8s并不直接处理容器,而是使用多个容器共存的理念,这组容器就叫做pod。 pod是k8s中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型,其他的资源对象…

【LeetCode-213】打家劫舍II(动态规划)

题目链接 目录 题目描述 解法1:动态规划 代码实现 题目链接 题目描述 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同…

车载测试面试:题库+项目

车载测试如何面试(面试技巧)https://blog.csdn.net/2301_79031315/article/details/136229809 入职车载测试常见面试题(附答案)https://blog.csdn.net/2301_79031315/article/details/136229946 各大车企面试题汇总(含答案&am…

Megalinter 初体验

简介 MegaLinter 是一个多语言、多工具的集成代码检查工具,它能够通过一个统一的工作流来运行多个静态代码分析工具,从而提供全面的代码质量检查。 官网:https://megalinter.io/latest/ MegaLinter 的特点: 多语言支持&#x…

Arcgis小技巧【17】——如何修改ArcGIS中影像的背景颜色

一、问题分析 在ArcGIS中,有时候会遇到影像有背景色,看上去很不美观。 尤其在多个影像叠加的时候,更是会造成遮挡的问题。 二、解决办法 首先,用【识别】工具在背景色是点击一下,查看弹出的窗口,记住背景…

新型智慧城区建设方案

智慧社区项目以改善基础设施环境为基础,以搭建社区综合服务平台为纽带,通过利用物联网、大数据技术建立覆盖社区居民生活方方面面的综合服务体系,向社区管理机构、服务机构和居民提供智能化服务,保障社区的安全,保障居…

二十四、k8s 资源管理

目录 一、资源配置范围管理 LimitRange介绍 1、LimitRange 可以做什么: 2、 资源限制和请求的约束 3、创建LimitsRange对象 4、示例:创建一个pod 5、测试用例 测试1: 测试2: 测试3: 二、资源服务质量管理(Requests Qos) 1、Qos级别分类: 1.1、Guarantee…

Go语言教程

一、引言 Go(又称Golang)是由Google开发的一种静态类型、编译型的开源编程语言。它旨在提供简单、快速和可靠的软件开发体验。Go语言结合了动态语言的开发效率和静态语言的安全性能,特别适用于网络编程、系统编程和并发编程。本教程将介绍Go…

ROS1 下载与运行Github上的ROS demo

目录 1 创建工作空间2 下载Github包到本地方法1:git方法2:下载3 编译准备3.1 安装依赖3.2 编译4 配置环境方法1:工作空间的.bash文件方法2:系统.bashrc文件5 运行ROS程序5.1 打开roscore终端5.2 执行程序1 创建工作空间 选择项目存放路径,创建工作空间,存放GitHub下

飞行机器人专栏(十三)-- 智能优化算法之粒子群优化算法与多目标优化

一、理论基础 1.1 引言 粒子群优化算法(Particle Swarm Optimization, PSO)自1995年由Eberhart和Kennedy提出以来,已经成为解决优化问题的一种有效且广泛应用的方法。作为一种进化计算技术,PSO受到社会行为模式,特别是…

document.cookie中expires 格式设置问题导致部分iphone safari上登录失效

一、问题描述 设备信息:iPhone 12, iOS 16.3 昨天有个小伙伴发现自己的iPhone safari打开网页登录时,登录页面显示登录成功,但实际进入首页后仍然显示未登录。多次测试,该问题在该设备上属于必现问题。 二、问题排查与解决 经过…