【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.hqwc.cn/news/487213.html

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

相关文章

128 Linux 系统编程6 ,C++程序在linux 上的调试,GDB调试

今天来整理 GDB 调试。 在windows 上我们使用vs2017开发,可以手动的加断点,debug。 那么在linux上怎么加断点,debug呢?这就是今天要整理的GDB调试工具了。 那么有些同学可能会想到:我们在windows上开发,…

Python 在Word中创建表格并填入数据、图片

在Word中,表格是一个强大的工具,它可以帮助你更好地组织、呈现和分析信息。本文将介绍如何使用Python在Word中创建表格并填入数据、图片,以及设置表格样式等。 Python Word库: 要使用Python在Word中创建或操作表格,需…

【更新】ARCGIS之成片区开发方案报备坐标txt格式批量导出工具(定制开发版)

序言 之前开发的成片区开发方案报备格式是按湖北省的标准定制的,目前,自然资源部又有了新的格式要求,现在新增国标版的成片区开发方案报备格式导出。 之前版本软件详见:软件介绍 一、软件简介 本软件是基于arcgis二次开发的工具&…

蜂窝物联网咖WiFi认证解决方案

项目背景 随着目前网咖模式越来越流行,给网吧部署一套无缝漫游的WIFI网络势在必行。同时,网吧无线准入的验证码在客户机上面进行更新,以防周边的人员进行蹭网,损失网吧的外网带宽。 01 需求分析 1. 网吧服务区域全部覆盖无盲区…

分享一个我爱工具网源码优化版

应用介绍 本文来自:分享一个我爱工具网源码优化版 - 源码1688 前几天在网上看到了一个不错的工具网源码,但是源码存在一些问题,遂进行了修改优化。 主要修改内容有: 1、后台改为账号密码登录,上传即用,不…

如何将建筑白模叠加到三维地球上?

​ 通过以下方法可以将建筑白模叠加到三维地球上。 方法/步骤 下载三维地图浏览器 http://www.geosaas.com/download/map3dbrowser.exe,安装完成后桌面上出现”三维地图浏览器“图标。 2、双击桌面图标打开”三维地图浏览器“ 3、点击“建筑白模”菜单&…

云图极速版限时免费活动

产品介绍 云图极速版是针对拥有攻击面管理需求的用户打造的 SaaS 应用,致力于协助用户发现并管理互联网资产攻击面。 实战数据 (2023.11.6 - 2024.2.23) 云图极速版上线 3 个月以来,接入用户 3,563 家,扫描主体 19,961 个,累计发…

【Python笔记-设计模式】装饰器模式

一、说明 装饰器模式是一种结构型设计模式,旨在动态的给一个对象添加额外的职责。 (一) 解决问题 不改变原有对象结构的情况下,动态地给对象添加新的功能或职责,实现透明地对对象进行功能的扩展。 (二) 使用场景 如果用继承来扩展对象行…

linux服务器tomcat日志中文出现问号乱码

目录 一、场景二、排查三、原因四、解决 一、场景 tomcat日志的中文出现问号乱码 乱码示例 ??[377995738417729536]????????? ac??????????????message:二、排查 1、使用locale命令查看服务器当前使用的语言包 发现只用的语言包为utf-8&#xff0…

SpringBoot项目实现文件上传,MINIO+OSS阿里云

MINIO 安装以及部署 官网:MinIO | Code and downloads to create high performance object storage 下载后是一个minio.exe的文件,可以先创一个文件夹来存放数据以及文件 在文件的目录下cmd进入控制台 minio.exe server data 启动成功后控制台会打印账…

opencv判断二值的情况

目的 先说说理论: 什么叫图像的二值化?二值化就是让图像的像素点矩阵中的每个像素点的灰度值为0(黑色)或者255(白色),也就是让整个图像呈现只有黑和白的效果。在灰度化的图像中灰度值的范围为0…

C# OpenVINO 百度PaddleSeg实时人像抠图PP-MattingV2

目录 效果 项目 代码 下载 C# OpenVINO 百度PaddleSeg实时人像抠图PP-MattingV2 效果 项目 代码 using OpenCvSharp; using Sdcb.OpenVINO; using System; using System.Diagnostics; using System.Drawing; using System.Security.Cryptography; using System.Text; us…