1、结构型模式描述如何将对象和类组合成更大的结构
2、结构型模式是一种能够简化设计工作的模式,因为它能够找出更简单的方法来认识或表示实体之间的关系。在面向对象世界中,实体指的是对象或类。
3、类模式可以通过继承来描述抽象,从而提供更有用的程序接口,而对象模式则描述了如何将对象联系起来从而组合成更大的对象。结构型模式是类和对象模式的综合体
下面是结构型设计模式的一些例子:
适配器模式:将一个接口转换成客户希望的另外一个接口。它试图根据客户端的需要来匹配不同类的接口。
桥接模式:该模式将对象的接口与其实现进行解耦,使得两者可以独立工作
装饰器模式:该模式允许在运行时或以动态的方式为对象添加职责,我们可以通过接口给对象添加某些属性
门面通常是指建筑物的表面,尤其时最有吸引力的那一面。它也可以表示一种容易让人误解某人的真实感受或情况的行为或面貌。当人们从建筑物的外面经过时,可以欣赏其外部面貌,却不了解建筑物结构的复杂性。这就是门面模式的使用方式。门面在隐藏内部系统复杂性的同时,为客户端提供一个接口,以便它们可以非常轻松访问系统。
门面设计模式实际上完成了下列事项:
1、它为子系统中的一组接口提供一个统一的接口,并定义一个高级接口来帮助客户端通过更加简单的方式使用子系统。
2、门面所解决问题是,如何使用单个接口对象来表示复杂的子系统。实际上,他并不是封装子系统,而是对底层子系统进行组合。
3、他促进了实现与多个客户端的解耦
门面设计模式主要有三个参与者,门面、系统、客户端
门面:门面的主要责任是,将一组复杂导致系统封装起来,从而为外部世界提供一个舒适的外观。
1、它是一个接口,他知道某给请求可以交个那个子系统进行处理
2、它使用组合将客户端的请求委派给相应的子系统对象
系统:这代表一组不同的子系统,是整个系统混杂在一起,难以观察或使用
1、它实现子系统的功能,同时,系统由一个类表示。理想情况下,系统应该由一组负责不同任务的类来表示。
2、它处理门面对象分配的工作,但并不知道门面,而且不吸引它
客户端:客户端与门面进行交互,这样就可以轻松地与系统进行同学并完成工作,不必担心系统的复杂性。
1、客户端是实例化门面的类
2、为了让子系统完成相应的工作,客户端需要向门面提出请求
假设你要在家中举办一场婚礼,并且由你来张罗着一切。这是一个艰巨的任务,你必须预订一家酒店或者场地,与餐饮人员交代酒菜、布置场景,并安排音乐。
下面我们从门面模式的角度来看待这些事情。
客户端:你需要在婚礼前及时完成所有的准备工作。每一项安排都应该是顶级的,这样客人才会喜欢这些庆祝活动。
门面:会务经理负责与所有相关人员进行交涉,这些人员负责处理食物、花卉装饰等
系统:它们代表提供餐饮、酒店管理和花卉装饰等服务的系统。
接下来要谈论的是Facade类。如前所述,Facade类简化了客户端的接口。就本例来说,EventManager扮演了门面的角色,并简化了你的工作,Facade与子系统进行交流,并代表你问婚姻完成所有的预定和准备工作。
下面是EventManager类的代码:
class EventManager(object):
def __init__(self):
self.hotelier = None
self.florist = None
self.caterer = None
self.musician = None
print("EventManager:让我和他们谈谈\n")
def arrange(self):
self.hotelier = Hotelier()
self.hotelier.book_hotel()
self.florist = Florist()
self.florist.set_flower_requirements()
self.caterer = Caterer()
self.caterer.set_cuisine()
self.musician = Musician()
self.musician.set_music_type()
下面我们开始深入了解子系统。
我们为这个场景开发了一下类。
① Hotelier类用于预定酒店。它有一个方法,用于检查当天是否有免费的酒店(__isAvailable)。
② Florist类负责花卉装饰。这个类提供了set_flower_requirements()方法,用于指定要使用那些种类的花卉来装饰婚礼。
③ Caterer类用于跟备办宴席者打交道,并负责安排餐饮。Caterer提供了一个公开的set_cuisine()方法,用来指定婚宴的菜肴类型。
④Musician类用来安排婚礼的音乐,它使用set_music_type()方法来了解婚礼的音乐要求。
以上四个类的代码如下:
class Hotelier(object):
def __init__(self):
print("安排婚礼的酒店?")
def __isAvailable(self):
print("活动当天酒店免费?")
return True
def book_hotel(self):
if self.__isAvailable():
print("预定酒店\n\n")
class Florist(object):
def __init__(self):
print("婚礼的花卉装饰?")
def set_flower_requirements(self):
print("康乃馨、玫瑰会被用来装饰\n\n")
class Caterer(object):
def __init__(self):
print("婚礼宴席的安排?")
def set_cuisine(self):
print("提供中式及欧式的菜肴\n\n")
class Musician(object):
def __init__(self):
print("婚礼的音乐安排?")
def set_music_type(self):
print("将演奏爵士乐和古典音乐")
但是,你很聪明,所以将这些事情都委托给了会务经理;下面看看You类,在本示例中,创建了一个EventManager类的对象,这样经理就会通过与相关人员进行交涉来筹备婚礼,而你则可以找个地方喝茶去了
class You(object):
def __init__(self):
print("You:婚礼的安排?")
def ask_event_manager(self):
print("You: 联系一下活动经理\n\n")
em = EventManager()
em.arrange()
def __del__(self):
print("所有的准备工作都已经完成")
you = You()
you.ask_event_manager()
门面模式背后的设计原理就是最少知识原则。
参考:
《python设计模式》(第2版)https://www.epubit.com/