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

Python设计模式详解之10 —— 外观模式

引言

Facade设计模式(外观模式)是一种软件设计模式,它提供了一个统一的接口来访问子系统中的一组接口。Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。当一个系统的内部实现非常复杂,或者需要与多个复杂的子系统交互时,Facade模式可以用来简化这些交互,使客户端代码更加简洁易懂。

文本形式的UML类图
+-------------------+
|      Client       |
+-------------------+
| - request()       |
+-------------------+
          |
          | uses
          v
+-------------------+
|     Facade        |
+-------------------+
| + operation1()    |
| + operation2()    |
+-------------------+
          |
          | delegates to
          v
+-------------------+         +-------------------+         +-------------------+
|   SubsystemA      |         |   SubsystemB      |         |   SubsystemC      |
+-------------------+         +-------------------+         +-------------------+
| + methodA1()      |         | + methodB1()      |         | + methodC1()      |
| + methodA2()      |         | + methodB2()      |         | + methodC2()      |
+-------------------+         +-------------------+         +-------------------+

UML图的详细解释

  • Facade (外观)

    • Facade 类提供了一个统一的接口,简化了对子系统的访问。它包含了方法 method1()method2(),这些方法可以调用一个或多个子系统类的方法。
  • SubSystemClassA, SubSystemClassB, SubSystemClassC (子系统类)

    • 这些类代表了复杂的子系统。每个子系统类都有一系列的方法(如 operation1()),这些方法实现了具体的业务逻辑。
    • Facade 类通过组合这些子系统类来提供更高层次的接口,从而简化了客户端的使用。

Facade设计模式的关键点

  • Facade(外观):为子系统的外部客户提供一个一致的接口,客户通过这个接口访问子系统的功能。
  • SubSystem(子系统):实现了子系统的功能,处理由Facade对象指派的任务。子系统并不知道Facade的存在,对于子系统而言,Facade仅仅是另一个客户端。

Facade设计模式的优缺点

优点
  • 降低复杂性:Facade模式隐藏了子系统的组件,减少了客户端所需处理的对象数量。
  • 提高灵活性:可以更容易地更改子系统的部分而不会影响到客户端。
  • 提高了安全性:可以通过限制对子系统的访问来增加安全措施。
缺点
  • 违反开闭原则:如果子系统的修改导致了Facade接口的改变,则客户端也必须做出相应的修改。
  • 可能会成为一个性能瓶颈:如果Facade管理的子系统非常庞大,那么Facade本身可能会成为性能瓶颈。

示例代码

假设我们有一个多媒体库,包含多个类如AudioPlayerVideoPlayer等,每个类都有自己的方法来处理音频和视频文件。为了简化客户端的使用,我们可以创建一个MultimediaFacade类,该类提供了简单的方法来控制这些多媒体播放器。

class AudioPlayer:
    def play(self, file_name):
        print(f"Playing audio file {file_name}")

    def stop(self):
        print("Stopping audio player")

class VideoPlayer:
    def play(self, file_name):
        print(f"Playing video file {file_name}")

    def stop(self):
        print("Stopping video player")

class MultimediaFacade:
    def __init__(self):
        self.audio_player = AudioPlayer()
        self.video_player = VideoPlayer()

    def play_audio(self, file_name):
        self.audio_player.play(file_name)

    def stop_audio(self):
        self.audio_player.stop()

    def play_video(self, file_name):
        self.video_player.play(file_name)

    def stop_video(self):
        self.video_player.stop()

# 客户端代码
facade = MultimediaFacade()
facade.play_audio('song.mp3')
facade.play_video('movie.mp4')

在这个例子中:

  • AudioPlayerVideoPlayer 是子系统类,分别负责处理音频和视频的播放。
  • MultimediaFacade 是外观类,提供了简单的接口 play_audio, stop_audio, play_video, stop_video,客户端通过这些方法来控制多媒体播放。

http://www.kler.cn/a/407040.html

相关文章:

  • 第144场双周赛题解:移除石头游戏
  • 【电源专题】BUCK电源SW电压的平均值为什么等于输出电压?
  • C语言——break、continue、goto
  • Python 使用 Token 认证方案连接 Kubernetes (k8s) 的详细过程
  • electron主进程和渲染进程之间的通信
  • 速通前端篇 —— CSS
  • 1123--日期类
  • 华为防火墙技术基本概念学习笔记
  • 医学AI公开课·第一期|Machine LearningTransformers in Med AI
  • D77【 python 接口自动化学习】- python基础之HTTP
  • 对撞双指针(七)三数之和
  • Jetpack Compose 如何布局解析
  • 系统设计---RBAC模型与ABAC模型
  • 【H2O2|全栈】JS进阶知识(九)ES6(5)
  • 大语言模型---Llama模型文件介绍;文件组成
  • 探索Python网络请求新纪元:httpx库的崛起
  • 小白投资理财 - 解读威廉分形指标 Williams Fractals
  • 高度统一:极大和极小如何统于一
  • 0基础如何进入IT行业?
  • 爬虫实战:采集知乎XXX话题数据
  • @RequestBody和前端的关系以及,如何在前后端之间传递数据?
  • mybatis-plus方法无效且字段映射失败错误排查
  • 【PPTist】添加PPT模版
  • 【Linux命令】grep
  • stm32与ht7038的项目
  • 第 22 章 - Go语言 测试与基准测试