一、门面模式的理解
门面模式是一种结构型设计模式,它主要是为了完成:
- 为子系统中的一组接口提供一个统一的接口,并定义一个高级接口来帮助客户端通过更加简单的方式使用子系统。
- 门面所解决问题是,如何用单个接口对象来表示复杂的子系统。
- 促进实现与多个客户端解耦
这个模式有三个参与者:
- 门面:将一个复杂的系统进行封装,为外部提供一个接口
- 系统:内部有多个不同的子系统
- 客户端:与门面直接进行交互,无需担心系统内部的复杂性
二、门面模式的实现
现实世界中有很多门面模式,比如,你现在要开一个大型生日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()
这样就完成了一个门面模式,门面模式设计的原理就是只是最少原则,减少对象之间的交互,在设计系统时,应该考虑与之交互类的数量以及交互的方式,这样避免了类与类之间紧密耦合的情况。