python设计模式之门面模式


一、理解结构型设计模式

          1.结构型模式描述如何将对象和类组合成更大的结构

        2.结构型模式是一种能够简化设计工作的模式,因为它能够找出更简单的方法来认识或表示实体之间的关系。在面向对象世界中,实体指的是对象或类。

        3.类模式可以通过继承来描述抽象,从而提供更有用的程序接口,而对象模式则描述了如何将对象联系起来从而组成更大的对象。结构型模式是类和对象模式的综合体。


二、理解门面设计模式

        1.它为子系统中的一组接口提供一个统一的接口,并定义一个高级接口来帮助客户用过简单的方式使用子系统。

        2.门面所解决问题是,如何用单个接口对象来表示复杂的子系统。实际上,他并不是封装子系统,而是对底层子系统进行组合。


三、UML图

python设计模式之门面模式_第1张图片

           1. 门面:门面的主要责任是将一组复杂的系统封装起来,从而为外面世界提供一个舒适的外观

                      1.1 它是一个接口,它知道某个请求可以交由哪个子系统进行处理。

                      1.2 它使用组合将客户端的请求委托给相应的子系统对象。

           2. 系统:这代表一组不同的子系统,使整个系统混杂在一起,难以观察或使用。

                      2.1 它实现子系统的功能,同时,系统由一个类表示。理想情况下,系统应该由一组负责不同的任务的类来表示。

                      2.2 它处理门面对象分配的工作,但并不知道门面,而且不引用它。

           3. 客户端:客户端与门面交互,这样就可以轻松地与子系统进行通信并完成工作了。不必担心系统的复杂性。

                      3.1 客户端是实例化门面的类。

                      3.2 为了让子系统完成相应的工作,客户端需要向门面提出请求。 


四、例子

 
  
# -*- coding: UTF-8 -*-

# 门面类
class EventManager(object):
    def __init__(self):
        print("Event Manager: Let me talk to the folks")

    def arrage(self):
        self.hotelier = Hotelier() # 酒店类
        self.hotelier.bookHotel() # 检查当天是不是由免费的酒店

        self.florist = Florist() # 鲜花类
        self.florist.setFlowerRequirements() # 用于指定要使用哪种画来装饰婚礼

        self.caterer = Caterer() # 宴席承办人类
        self.caterer.setCuisine() # 指定酒店的饭菜类型

        self.musician = Musician() # 婚礼音乐类
        self.musician.setMusicType() #音乐要求


# 事件
class Hotelier(object):
    def __init__(self):
        print("安排酒店结婚? --")

    def __isAvilable(self):
        print("免费就结,不免费不结了?")
        return True

    def bookHotel(self):
        if self.__isAvilable():
            print("给老子订一间房")

# 事件
class Florist(object):
    def __init__(self):
        print("鲜花事件")

    def setFlowerRequirements(self):
        print("九十九朵浪漫的玫瑰吧")

# 事件
class Caterer(object):
    def __init__(self):
        print("宴席承办人事件")

    def setCuisine(self):
        print("中国菜和印度菜将被提供")

# 事件
class Musician(object):
    def __init__(self):
        print("婚礼音乐事件")

    def setMusicType(self):
        print("播放《今天你要嫁给我》")

# 事件
class You(object):
    def __init__(self):
        print("你:婚礼安排")

    def askEventManager(self):
        print("你:让我和活动经理联系下")
        em = EventManager()
        em.arrage()

    def __del__(self):
        print("感谢你活动经历,所有东西都安排妥当了")

you = You()
you.askEventManager()


 
  
 
  

 
  
 
  


五、最少知识原则

        最少知识原则:减少对象之间的交互。

               1.在设计系统是,对于创建的每个对象,都应该考察与之狡猾的类的逻辑,以及交互的方式。

               2.遵循这个原则,就能够避免创建许多彼此紧密耦合的类的情况。

               3.如果类之间存在大量依赖关系,那么系统就会变得难以维护。如果对系统中的任务一部分进行修改,都可能导致系统的其他部分被无意改变,这意味着系统会退化,                   是应该被避免的。


六、常见问答

        1. 迪米特法则是什么,它与工厂模式有何关联?

               1.1 迪米特法则:

                         1.1.1 每个单元对系统中其他单元知道的越少越好。

                         1.1.2 单元应该只与朋友交流。

                         1.1.3 单元不应该知道它操作的对象的内部细节。

                1.2 最少知识原则和迪米特法则是一致的,都是指向送耦合理论。就像他的名称暗示的那样,最少知识原则适用于门面模式的用例,并且“原则”这个词是指导方针的意                       思,不是严格遵守的意思,并且只有在修的时候采用。

        2. 子系统可以有多个门面吗?

                一组子系统组件实现多个门面

        3. 最少知识原则的缺点是什么?

               门面提供了一个简化的接口供客户端与子系统交互。本着提供简化接口的精神应用可能会建立多个不必要的接口,这增加了系统的复杂性并且降低了运行时的性能。

        4. 客户端可以独立访问子系统吗?

               是的,实际上,由于门面模式提供了简化的接口,这使得客户端不必担心系统的复杂性。

        5. 门面是否可以添加自己的功能?

               门面可以将其“想法”添加到子系统中,例如确保子系统的改进顺序由门面来jued



本系列项目代码地址:Python-design-pattern

 
  
 
 

你可能感兴趣的:(python,Python设计模式(第2版),设计模式,python,门面模式)