设计模式之门面模式

一、门面模式的理解

门面模式是一种结构型设计模式,它主要是为了完成:

  • 为子系统中的一组接口提供一个统一的接口,并定义一个高级接口来帮助客户端通过更加简单的方式使用子系统。
  • 门面所解决问题是,如何用单个接口对象来表示复杂的子系统。
  • 促进实现与多个客户端解耦

这个模式有三个参与者:

  • 门面:将一个复杂的系统进行封装,为外部提供一个接口
  • 系统:内部有多个不同的子系统
  • 客户端:与门面直接进行交互,无需担心系统内部的复杂性

二、门面模式的实现

  现实世界中有很多门面模式,比如,你现在要开一个大型生日party,那么可能需要准备酒店、歌唱团之类的东西,但是你可能嫌麻烦,此时可以找一个专门负责此类事务的机构负责,而你只需要问他是否已经筹备好即可。这可以比如一个门面模式:

  • 客服端:相当于需要在开始生日party前的所有准备工作
  • 门面:相当于处理准备工作的机构
  • 子系统:相当于酒店的餐饮、歌唱团的娱乐这一类的服务

现在利用python对上述的实例进行模拟,显然有一个门面类EventManager,它简化了你的工作,完成与子系统的交流,如下所示,生日party的门面需要与酒店与歌唱团交流。

class EventManager:

    def __init__(self):
        print("I talk to folks!")

    def arrange(self):

        self.wineshop=WineShop()
        self.wineshop.bookWineShop()

        self.singgroup=SingGroup()
        self.singgroup.setSingType()

子系统就是酒店系统与歌唱团系统,它们自己将自己的服务准备完成。

class WineShop:

    def __init__(self):
        print("arange of WineShop for birthday!")

    def __isAliable(self):
        """
        酒店是否还有可用的房间
        :return: 
        """
        return True

    def bookWineShop(self):
        """
        如果有可用房间就进行预定
        :return: 
        """
        if self.__isAliable():
            print("book success!")

class SingGroup:

    def __init__(self):
        print("arange of SingGroup for birthday!")

    def setSingType(self):
        """
        歌唱团为生日party准备的音乐
        :return: 
        """
        print("Classical will be played")

而此时你可以很悠闲,当想知道酒店以及歌唱团准备的怎么样,可以直接询问机构,它会告诉你。

class You:

    def __init__(self):
        print("Birthday arrangements? ")

    def askEventManager(self):
        print("contact EventManager")
        em=EventManager()
        em.arrange()


you=You()
you.askEventManager()

  这样就完成了一个门面模式,门面模式设计的原理就是只是最少原则,减少对象之间的交互,在设计系统时,应该考虑与之交互类的数量以及交互的方式,这样避免了类与类之间紧密耦合的情况。

原文地址:https://www.cnblogs.com/shenjianping/p/11079923.html