python设计模式之门面模式

一.结构型设计模式

门面模式与单例模式,工厂模式不同,它是一种结构型模式。

  • 结构型模式描述如何将对象和类组合成更大的结构
  • 结构型模式是一种能够简化设计工作的模式,它能找出更简单的方法来认识或表示实体之间的关系。
  • 结构型模式是类和对象模式的综合体。类模式通过继承来描述抽象,从而提供更有用的程序接口,而对象模式描述了如何将对象联系起来从而组合成更大的对象。

二.理解门面设计模式

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

通过这三条内容,还是难以理解门面模式具体的理念,我们借助一个UML图来理解:

这里面有三个参与者,门面,客户端,系统
客户端:客户端实例化门面类,并向门面提出要求,去让子系统完成相应的功能
门面:门面接到客户端的请求,去判断该由哪些子系统完成工作,并且安排给他们任务。
系统:系统处理门面对象分配的任务,完成工作

简单理解:整个模式的执行方式就是,门面接收客户端的需求,去安排系统完成工作。用一个简单的例子举例:去快餐店,我们向服务员点了一份xx套餐,套餐里有一杯冰可乐,一个汉堡,一份薯条,这时服务员听到你的点餐后,扭头告诉后厨需要一份xx套餐,于是后厨有三个人开始行动,一个做可乐,一个做汉堡,一个做薯条。这个例子里,你就是客户端,服务员为门面,后厨的三个人做东西为三个子系统,他们组合合作完成这份套餐的制作。这样看来,门面模式的理解便非常简单了

三.python实现门面模式

就用上述快餐店点餐的例子


class Client():
    def order(self):
        Waiter().make_set_meal1()

class Waiter():
    def make_set_meal_1(self):
        Coke().make()
        Hamburger().make()
        French_fries().make()

class Coke():
    def make(self):
        print('making coke')

class Hamburger():
    def make(self):
        print('making hamburger')

class French_fries():
    def make(self):
        print('making french fries')

you=Client()
you.order()
'''

making coke
making hamburger
making french fries

'''

这里的make_set_meal_1,做套餐1,也就是让子系统的组合完成任务,将这个复杂的组合封装了起来。当然可能还有其他类型的套餐,那么Waiter里还可以添加其他的方法,但是这与子系统没有太大的联系,只是增加了又一种组合,例如只点可乐和汉堡的套餐,只需要增加Waiter的方法,不需要修改子系统。

四.最少知识原则

门面模式背后的设计原理就是最少知识原则,它的理念为减少对象之间的交互,这意味着:

  • 对于设计系统时创建的每个对象,都应该考察与之交互的类的数量以及交互的方式
  • 这样能够避免创建许多彼此紧密耦合的类,如果类与类之间存在大量的依赖关系,那么对于系统的任何一部分的修改都有可能导致系统的其他部分无意的被改变。

参考《python设计模式(第2版)》

posted @ 2018-11-29 08:09  sfencs  阅读(849)  评论(0编辑  收藏  举报