门面模式-----与门面相适

#门面模式
##一、理解结构型设计模式

以下几点将有助于我们更好地了解结构型设计模式:
(1)结构型模式描述如何将对象和类组合成更大的结构。
(2)结构型模式是一种能够简化设计工作的模式,因为它能够找出更简单的方法来认识或表示实体之间的关系。在面向对象世界中,实体指的是对象或类。
(3)类模式可以通过继承来描述抽象,从而提供更有用的程序接口,而对象模式则描述了如何将对象联系起来从而组合成更大的对象。结构型模式是类和对象模式的综合体。
下面给出结构型设计模式的几个例子。你会注意到,它们都是通过对象或类之间的交互来实现更高级的设计或架构目标的。
(1)适配器模式:将一个接口转换成客户希望的另外一个接口。它试图根据客户端的需求来匹配不同类的接口。
(2)桥接模式:该模式将对象的接口与其实现进行解耦,使得两者可以独立工作。
(3)装饰器模式:该模式允许在运行时或以动态方式为对象添加职责。我们可以通过接口给对象添加某些属性。
##二、理解门面设计模式
门面(facade)在隐藏内部系统复杂性的同时,为客户端提供了一个接口,以便它们可以非常轻松地访问系统。
门面设计模式实际上完成了下列事项:
(1)它为子系统的一组接口提供一个统一的接口,并定义一个高级接口来帮助客户端通过更加简单的方式使用子系统。
(2)门面所解决问题是,如何用单个接口对象来表示复杂的子系统。实际上,它并不是封装子系统,而是对底层子系统进行组合。
(3)它促进了实现与多个客户端的解耦。
UML类图:

这里写图片描述

这个模式有3个主要的参与者:

  • 门面:门面的主要责任是,将一组复杂子相同封装起来,从而为外部世界提供一个舒适的外观。
  • 系统:这代表一组不同的子系统,使整个系统混杂在一起,难以观察或使用。
  • 客户端:客户端与门面进行交互,这样就可以轻松地与子系统进行通信并完成工作了。不必担心系统的复杂性。

从数据结构的角度进一步介绍这3个主要参与者:

(1)门面
以下几点可以帮助我们更好地理解门面:

  • 它是一个接口,它知道某个请求可以交由哪个子系统进行处理。
  • 它使用组合将客户端的请求委派给相应的子系统对象。

例如,如果客户端正在了解哪些工作已完成,则不需要到各个子系统去,相反,它只需要联系完成工作的接口(门面)就可以了。
(2)系统
在门面的世界里,系统就是执行以下操作的实体。

  • 它实现子系统的功能,同时,系统由一个类表示。理想情况下,系统应该由一组负责不同任务的类来表示。
  • 它处理门面对象分配的工作,但并不知道门面,而且不引用它。

例如,当客户端向门面请求某项服务时,门面会根据服务的类型来选择提供该服务的相应子系统。
(3)客户端

  • 客户端是实例化门面的类
  • 为了让子系统完成相应的工作客户端需要向门面提出请求。

以店主为例进行介绍,假设你要到某个商店去买东西,但是你对这个商店的布局并不清楚。通常情况下,你会去找店主,因为店主对整个商店都很清楚。只要你告诉他要买什么,店主就会把这些商品拿给你。顾客不必了解店面的情况,可以通过一个简单的接口来完成购物,这里的接口就是店主。
##三、在现实世界中实现门面模式
假设你要举行一场婚礼,并且由你来张罗这一切。这是一个艰巨的任务,你必须预定一家酒店或场地,与餐饮人员交代酒菜、布置场景、并安排背景音乐。
在不久之前,你已经自己搞定了一切,例如找相关人员谈话、与他们进行协调、敲定价格等,那么现在你就很轻松了。此外,你还可以去找会务经理,让他为你处理这些事情。会务经理负责跟各个服务提供商交涉,并为你争取最优惠的价格。
下面我们从门面模式的角度来看待这些事情:

  • 客户端:你需要在婚礼前及时完成所有的准备工作。每一项安排都应该是顶级的,这样客人才会喜欢这些庆祝活动。
  • 门面:会务经理负责与所有相关人员进行交涉,这些人员负责处理食物、花卉装饰等。
  • 子系统:它们代表提供餐饮、酒店管理和花卉装饰等服务的系统。

代码实现:

#EventManager类扮演了门面的角色,并简化了你的工作。门面与子系统进行交流,并代表
#你为婚姻完成所有的预定和准备工作。
class EventManager:
	def __init__(self):
		print('Event Manager: Let me talk to the folks')
	def arrange(self):
		self.hotelier = Hotelier()
		self.hotelier.bookHotel()
		
		self.florist = Florist()
		self.florist.setFlowerRequirements()
		
		self.caterer = Caterer()
		self.caterer.setCuisine()
		
		self.musician = Musician()
		self.musician.setMusic()
#子系统:
class Hotelier:		#预定酒店
	def __init__(self):
		print('arranging the Hotel for marriage?')
	def __isAvailable(self):
		print('Is there are hotels?')
		return True
	def bookHotel(self):
		if self.__isAvailable:
			print('book hotel successfully.')
class Florist:		#花卉装饰
	def __init__(self):
		print('Flower Decorations for the marriage?')
	def setFlowerRequirements(self):	
		print('<<**Roses will be used for decorations**>>')
class Caterer:		#安排餐饮
	def __init__(self):
		print('Food for the marriage?')		
	def setCuisine(self):		
		print('Chinese food will be served...')
class Musician:		#安排音乐
	def __init__(self):
		print('Music for marriage?')	
	def setMusic(self):
		print('Jazz will be played.')
#将这些事情委托给会务经理:		
class You:
	def __init__(self):
		print('You: Whoa! Marriage Arrangement?')
	def askEventManager(self):	
		print('You: Let\'s contact the Event Manager')
		em = EventManager()
		em.arrange()
	def __del__(self):	
		print('You: Thanks to Event Manager,all preparations done!')
		
if __name__ == '__main__':
	you = You()
	you.askEventManager()	

##四、最少知识原则

门面为我们提供了一个统一的系统,它使得子系统更加易于使用。它还将客户端与子系统解耦。门面模式背后的设计原理就是最少知识原则。
最少知识原则指导我们减少对象之间的交互,它意味着:
(1)在设计系统时,对于创建的每个对象,都应该考察与之交互的类的数量,以及交互的方式。
(2)遵循这个原则,就能够避免创建许多彼此紧密耦合的类的情况。
(3)如果类之间存在大量以来关系,那么系统就会变得难以维护。如果对系统中的任何一部分进行修改,都可能导致系统的其他部分被无意改变,这意味着系统会退化,是应该坚决避免的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值