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

一、说明

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

(一) 解决问题

简化复杂系统的接口调用

(二) 使用场景

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

二、结构

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

三、伪代码

python 复制代码
#!/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博客

相关推荐
捕鲸叉5 小时前
C++软件设计模式之外观(Facade)模式
c++·设计模式·外观模式
重生之绝世牛码1 天前
Java设计模式 —— 【结构型模式】外观模式详解
java·大数据·开发语言·设计模式·设计原则·外观模式
越甲八千3 天前
重拾设计模式-外观模式和适配器模式的异同
设计模式·适配器模式·外观模式
越甲八千3 天前
重拾设计模式--外观模式
c++·设计模式·外观模式
西岭千秋雪_9 天前
设计模式の装饰者&组合&外观模式
java·python·设计模式·组合模式·装饰器模式·外观模式
去看全世界的云16 天前
【设计模式】结构型设计模式总结之代理模式、装饰模式、外观模式、享元模式
android·java·设计模式·代理模式·享元模式·外观模式
Fre丸子_18 天前
C++设计模式之外观模式
c++·设计模式·外观模式
阳光开朗_大男孩儿18 天前
外观设计模式
c++·设计模式·外观模式
机器视觉知识推荐、就业指导19 天前
C++设计模式外观模式(Facade)(家庭影院案例)
c++·设计模式·外观模式
澄澈i23 天前
设计模式学习[10]---迪米特法则+外观模式
学习·设计模式·外观模式·迪米特法则