您的位置:首页 > 编程语言 > Python开发

python设计模式之门面模式

2017-11-21 22:33 288 查看
一、理解结构型设计模式

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

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

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

二、理解门面设计模式

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

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

三、UML图



           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



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息