外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个简化接口,用于访问系统中一组接口的子系统。外观模式定义了一个高层接口,使得客户端可以通过这个接口访问子系统,而不需要了解子系统的详细实现。

外观模式包含以下主要角色:

1. 外观(Facade): 提供了一个简化的接口,将客户端与子系统的交互进行封装。

2. 子系统(Subsystem): 实现了系统的功能,客户端可以通过外观模式提供的接口来访问子系统的功能。

3. 客户端(Client): 使用外观模式提供的接口来访问子系统。

下面是一个简单的外观模式的例子,假设我们有一个音响系统,其中包含了多个子系统(CD播放器、投影仪、音响等):
# 子系统:CD播放器
class CDPlayer:
    def on(self):
        print("CD Player is ON")

    def play(self):
        print("CD is playing")

    def off(self):
        print("CD Player is OFF")

# 子系统:投影仪
class Projector:
    def on(self):
        print("Projector is ON")

    def play(self):
        print("Projector is projecting")

    def off(self):
        print("Projector is OFF")

# 子系统:音响
class AudioSystem:
    def on(self):
        print("Audio System is ON")

    def play(self):
        print("Audio is playing")

    def off(self):
        print("Audio System is OFF")

# 外观
class HomeTheaterFacade:
    def __init__(self, cd_player, projector, audio_system):
        self._cd_player = cd_player
        self._projector = projector
        self._audio_system = audio_system

    def watch_movie(self):
        print("Get ready to watch a movie!")
        self._cd_player.on()
        self._projector.on()
        self._audio_system.on()
        self._cd_player.play()
        self._projector.play()
        self._audio_system.play()

    def end_movie(self):
        print("Movie is over, shutting down the home theater")
        self._cd_player.off()
        self._projector.off()
        self._audio_system.off()

# 客户端代码
if __name__ == "__main__":
    # 创建子系统对象
    cd_player = CDPlayer()
    projector = Projector()
    audio_system = AudioSystem()

    # 创建外观对象
    home_theater = HomeTheaterFacade(cd_player, projector, audio_system)

    # 使用外观模式提供的接口来操作子系统
    home_theater.watch_movie()
    home_theater.end_movie()

在上述示例中,CDPlayer、Projector、AudioSystem 分别代表音响系统的三个子系统。HomeTheaterFacade 是外观,提供了 watch_movie 和 end_movie 两个接口,客户端可以通过这两个接口来操作整个音响系统,而不需要了解每个子系统的详细操作。

外观模式的优点在于它提供了一个简化的接口,隐藏了子系统的复杂性,使得客户端更加容易使用。这样可以降低客户端与子系统之间的耦合度,提高系统的可维护性和扩展性。


转载请注明出处:http://www.pingtaimeng.com/article/detail/11848/设计模式