结构型设计模式-外观(facade)模式 - python实现
设计模式汇总:查看
通俗示例
想象一下你去餐厅吃饭,当你坐下后,服务员会为你提供菜单,并负责帮你点菜,通知厨房烹饪,最后将食物端给你。在整个过程中,你不需要直接和厨师、洗碗工或其他餐厅工作人员打交道,服务员在这里就充当了一个“外观”的角色,简化了整个用餐过程。
通俗解释
外观模式是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。外观模式隐藏了子系统的复杂性,简化了客户端的使用。它就像一个中介,客户端只需要和这个中介交互,而中介则负责与子系统中的各个部分进行交互。
在外观模式中,通常涉及以下角色:
- 外观(Facade):提供了一个统一的接口,客户端通过这个接口与子系统进行交互。
- 子系统(Subsystem):实现了具体的业务逻辑,通常包含多个模块,这些模块的接口可能会比较复杂。
- 客户端(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 封装了复杂操作,当有紧急情况下,执行所有的紧急响应流程。
总结
外观模式适用于简化复杂系统的接口,它将客户端与子系统之间的复杂交互封装在一个简单的接口后面,使得系统更加易于使用和维护。外观模式在软件开发中广泛使用,特别是在设计复杂的库和框架时。