打个还算比较形象的比喻吧,我们把门面比作建筑工地上的建筑物的表面,可以是贴有横幅,如:XXXX铁路工程局,这种比较醒目的一面,能更吸引人注意力,当人们从建筑物旁边经过时,可以看到其外部的面貌,此时并不了解其本身结构的复杂性。 在程序里门面在隐藏内部复杂性的同时,也为外部客户端提供了一个可以轻松访问的接口。
门面模式与单例模式,工厂模式不同,它是一种结构型模式。
下图或许能帮助你更好的理解:

这里面有三个参与者:门面,客户端,系统
客户端
会实例化门面 会向门面提出请求,去让子系统完成相应的功能 客户端与门面进行交互,这样就可以轻松地与子系统进行通信并完成工作事项,而不必担心系统的复杂性。
门面
一个接口,知道某个请求应该交由哪个子系统处理 通过组合的方式将客户端的请求委派给相应的子系统对象
系统
实现子系统的功能,由一组负责不同任务的类来表示 处理门面对象分配的工作,但并不知道门面也不引用它
简单理解:整个模式的执行方式就是,门面接收客户端的需求后,去安排系统完成工作。
举个生活中常见的例子:某天,你和朋友一起去肯德基,你向服务员点了一份XXX套餐,套餐里有一杯冰可乐,一个汉堡,一份薯条,一份麻辣鸡翅,这时服务员听到你的点餐请求后,扭头告诉后厨需要一份XXX套餐,于是后厨有4个人开始行动,一个做可乐,一个做汉堡,一个做薯条,一个做鸡翅。
在这个例子里,你就是客户端,服务员为门面,后厨的4个人做东西为4个子系统,他们组合合作完成这份套餐的制作。这样看来,门面模式的理解便非常简单清晰了。
#门面
class ProjectProcess(object):
def __init__(self):
print("get the project of the process")
def get_process(self):
self.req=Requirement()
self.req.getRequirementProcess()
self.dev=Develop()
self.dev.getDevelopProcess()
self.test=Test()
self.test.getTestProcess()
#子系统
class Requirement(object):
def __init__(self):
print("return the requirement of process")
def getRequirementProcess(self):
print("the requirement was complement 90%")
class Develop(object):
def __init__(self):
print("return the requirement of process")
def getDevelopProcess(self):
print("the develop was complement 30%")
class Test(object):
def __init__(self):
print("return the requirement of process")
def getTestProcess(self):
print("the test was complement 10%")
#客户端
if __name__ == '__main__':
pp = ProjectProcess()
pp.get_process()
(1)、门面能够将客户端与实现具体功能的子系统解耦,其背后的设计原理即最少知识原则。
(2)、在设计系统时,对于创建的每个对象,都应该考察与之交互的类的数量,以及交互的方式避免创建许多彼此紧密耦合的类。若类之间存在大量的依赖关系,系统就会变得难以维护。
end