看Python 如何实现门面模式
引言
打个还算比较形象的比喻吧,我们把门面比作建筑工地上的建筑物的表面,可以是贴有横幅,如:XXXX铁路工程局,这种比较醒目的一面,能更吸引人注意力,当人们从建筑物旁边经过时,可以看到其外部的面貌,此时并不了解其本身结构的复杂性。
在程序里门面在隐藏内部复杂性的同时,也为外部客户端提供了一个可以轻松访问的接口。
结构型设计模式
门面模式与单例模式,工厂模式不同,它是一种结构型模式。
-
结构型模式描述如何将对象和类组合成更大的结构。
-
结构型模式是一种能够简化设计工作的模式,它能找出更简单的方法来认识或表示实体之间的关系。
-
结构型模式是类和对象模式的综合体。类模式通过继承来描述抽象,从而提供更有用的程序接口,而对象模式描述了如何将对象联系起来从而组合成更大的对象。
理解门面设计模式
-
它为子系统中的一组接口提供一个统一的接口,并定义一个高级接口来帮助客户端通过更简单的方式使用子系统。
-
门面所解决的问题是,如何用单个接口对象来表示复杂的子系统,它实际上并不是封装子系统,而是对底层子系统进行组合。
-
促进实现子系统与客户端的解耦。
下图或许能帮助你更好的理解:
这里面有三个参与者:门面,客户端,系统
客户端
会实例化门面
会向门面提出请求,去让子系统完成相应的功能
客户端与门面进行交互,这样就可以轻松地与子系统进行通信并完成工作事项,而不必担心系统的复杂性。
门面
一个接口,知道某个请求应该交由哪个子系统处理
通过组合的方式将客户端的请求委派给相应的子系统对象
系统
实现子系统的功能,由一组负责不同任务的类来表示
处理门面对象分配的工作,但并不知道门面也不引用它
简单理解:整个模式的执行方式就是,门面接收客户端的需求后,去安排系统完成工作。
举个生活中常见的例子:某天,你和朋友一起去肯德基,你向服务员点了一份XXX套餐,套餐里有一杯冰可乐,一个汉堡,一份薯条,一份麻辣鸡翅,这时服务员听到你的点餐请求后,扭头告诉后厨需要一份XXX套餐,于是后厨有4个人开始行动,一个做可乐,一个做汉堡,一个做薯条,一个做鸡翅。
在这个例子里,你就是客户端,服务员为门面,后厨的4个人做东西为4个子系统,他们组合合作完成这份套餐的制作。这样看来,门面模式的理解便非常简单清晰了。
Python 实现门面模式
#门面 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)、在设计系统时,对于创建的每个对象,都应该考察与之交互的类的数量,以及交互的方式避免创建许多彼此紧密耦合的类。若类之间存在大量的依赖关系,系统就会变得难以维护。
欢迎关注【无量测试之道】公众号,回复【领取资源】
Python编程学习资源干货、
Python+Appium框架APP的UI自动化、
Python+Selenium框架Web的UI自动化、
Python+Unittest框架API自动化、
资源和代码 免费送啦~
文章下方有公众号二维码,可直接微信扫一扫关注即可。
备注:我的个人公众号已正式开通,致力于测试技术的分享,包含:大数据测试、功能测试,测试开发,API接口自动化、测试运维、UI自动化测试等,微信搜索公众号:“无量测试之道”,或扫描下方二维码:
添加关注,让我们一起共同成长!