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

结构型设计模式-外观(facade)模式 - python实现

设计模式汇总:查看

通俗示例

想象一下你去餐厅吃饭,当你坐下后,服务员会为你提供菜单,并负责帮你点菜,通知厨房烹饪,最后将食物端给你。在整个过程中,你不需要直接和厨师、洗碗工或其他餐厅工作人员打交道,服务员在这里就充当了一个“外观”的角色,简化了整个用餐过程。

通俗解释

外观模式是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。外观模式隐藏了子系统的复杂性,简化了客户端的使用。它就像一个中介,客户端只需要和这个中介交互,而中介则负责与子系统中的各个部分进行交互。

在外观模式中,通常涉及以下角色:

  1. 外观(Facade):提供了一个统一的接口,客户端通过这个接口与子系统进行交互。
  2. 子系统(Subsystem):实现了具体的业务逻辑,通常包含多个模块,这些模块的接口可能会比较复杂。
  3. 客户端(Client):通过外观提供的接口使用子系统。

外观模式的优点

  • 简化接口:外观模式提供了一个简化的接口,使得子系统更加容易使用。
  • 降低耦合度:客户端与子系统之间的耦合度降低,客户端不需要了解子系统的内部实现。
  • 提高可维护性:修改子系统的内部实现不会影响到客户端,只需要修改外观类即可。

Python代码示例

以下是一个外观模式的简单实现,以家庭影院系统为例:

class AlarmSensor:
    def run(self):
        print("Alarm Ring...")


class WaterSprinker:
    def run(self):
        print("Spray Water...")


class EmergencyDialer:
    def run(self):
        print("Dial 119...")


class EmergencyFacade:
    """
    外观类中封装了对子系统的操作
    """
    def __init__(self):
        self.alarm_sensor = AlarmSensor()
        self.water_sprinker = WaterSprinker()
        self.emergency_dialer = EmergencyDialer()

    def runAll(self):
        self.alarm_sensor.run()
        self.water_sprinker.run()
        self.emergency_dialer.run()


# 当模块作为主程序运行时,执行以下代码
if __name__ == "__main__":
    # 初始化紧急情况Facade(外观模式)对象,负责协调和管理紧急响应系统的各个部分
    emergency_facade = EmergencyFacade()
    # 启动紧急响应系统,执行所有的紧急响应流程
    emergency_facade.runAll()

这段代码定义了四个类:AlarmSensor、WaterSprinker、EmergencyDialer 和 EmergencyFacade。其中:

  • AlarmSensor 类有一个方法 run,功能是打印 “Alarm Ring…”,模拟报警器响铃。
  • WaterSprinker 类的 run 方法打印 “Spray Water…”,模拟喷水器喷水。
  • EmergencyDialer 类的 run 方法打印 “Dial 119…”,模拟自动拨打火警电话。

EmergencyFacade 封装了复杂操作,当有紧急情况下,执行所有的紧急响应流程。

总结

外观模式适用于简化复杂系统的接口,它将客户端与子系统之间的复杂交互封装在一个简单的接口后面,使得系统更加易于使用和维护。外观模式在软件开发中广泛使用,特别是在设计复杂的库和框架时。


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

相关文章:

  • 数据库事务详解
  • 客户案例:电商平台对帐-账单管理(亚马逊amazon)
  • python创建一个httpServer网页上传文件到httpServer
  • vue3 通用svg组件
  • [Effective C++]条款48 模板元编程(TMP)
  • .NET开源的处理分布式事务的解决方案
  • js逆向基础10面向对象继承2
  • 240907-Gradio插入Mermaid流程图并自适应浏览器高度
  • 2.2.3 UDP的可靠传输协议QUIC 2
  • 【读书笔记-《30天自制操作系统》-19】Day20
  • 【Python知识宝库】迭代器与生成器:高效处理大数据集
  • SQL的高级查询练习知识点中(day25)
  • 认识向量数据
  • 【Docker系列】docker缓存详解
  • 【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)
  • HAL库学习目录查询表
  • 在WPF中集成OpenTK画图形
  • google vr 入门之VrPanoramaView制作全景图列表(1)
  • 深入理解Spring Boot结合MyBatis调用MySQL,并实现主从复制读写分离
  • Linux进阶命令-echodatealias
  • redis底层—网络模型
  • 在社交物联网中使用MQTT协议和Hardy Wall算法实现有效的多播通信
  • [论文笔记]ChatQA: Surpassing GPT-4 on Conversational QA and RAG
  • 分布式项目中使用雪花算法提前获取对象主键ID
  • 非关系型数据库Redis
  • PDF和CDF