Python设计模式——外观模式(门面模式)

假设你去买东西,你肯定是问店主,因为店主对这家店的货物分布比你熟悉,然后店主把你需要的东西交给你,就这么简单。




要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。外观模式提供一个高层次的接口,使得子系统更易于使用。

It provides a unified interface to a set of interfaces in a subsystem and defines a highlevel interface that helps the client use the subsystem in an easy way.

除了这个接口不允许有任何访问子系统的行为发生。
Facade门面角色:客户端可以调用这个角色的方法。次角色知晓子系统的所有功能和责任。一般情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去,也就是说该角色没有实际的业务逻辑,只是一个委托类。
subsystem子系统角色:每一个子系统都不是一个单独的类,而是一个类的集合。子系统不知道门面的存在。对于子系统而言,门面仅仅是另外一个客户端而已。

实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# coding:utf-8
'''
你 向 Manager 询问,Manager回答你,你不用关心里面的细节
'''
class EventManager(object):
def __init__(self):
print("Event Manager:: Let me talk to the folks\n")
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.setMusicType()
class Hotelier(object):
def __init__(self):
print("Arranging the Hotel for Marriage? --")
def __isAvailable(self):
print("Is the Hotel free for the event on given day?")
return True
def bookHotel(self):
if self.__isAvailable():
print("Registered the Booking\n\n")
class Florist(object):
def __init__(self):
print("Flower Decorations for the Event? --")
def setFlowerRequirements(self):
print("Carnations, Roses and Lilies would be used for Decorations\n\n")
class Caterer(object):
def __init__(self):
print("Food Arrangements for the Event --")
def setCuisine(self):
print("Chinese & Continental Cuisine to be served\n\n")
class Musician(object):
def __init__(self):
print("Musical Arrangements for the Marriage --")
def setMusicType(self):
print("Jazz and Classical will be played\n\n")
class You(object):
def __init__(self):
print("You:: Whoa! Marriage Arrangements??!!!")
def askEventManager(self):
print("You:: Let's Contact the Event Manager\n\n")
em = EventManager()
em.arrange()
def __del__(self):
print("You:: Thanks to Event Manager, all preparations done!Phew!")
you = You()
you.askEventManager()
'''
You:: Whoa! Marriage Arrangements??!!!
You:: Let's Contact the Event Manager
Event Manager:: Let me talk to the folks
Arranging the Hotel for Marriage? --
Is the Hotel free for the event on given day?
Registered the Booking
Flower Decorations for the Event? --
Carnations, Roses and Lilies would be used for Decorations
Food Arrangements for the Event --
Chinese & Continental Cuisine to be served
Musical Arrangements for the Marriage --
Jazz and Classical will be played
You:: Thanks to Event Manager, all preparations done!Phew!
'''

优点

  • 减少了系统的相互依赖。所有的依赖都是对门面对象的依赖,与子系统无关
  • 提高灵活性,不管子系统内部如何变化,只要不影响到门面对象,任你自由活动
  • 提高安全性

缺点

  • 不符合开闭原则,对修改关闭,对扩展开放。唯一能做的就只有修改门面角色的代码。

场景

  • 为一个复杂的模块或子系统提供一个供外界访问的接口
  • 子系统相对独立——外界对子系统的访问只要黑箱操作即可

注意事项

  • 一个子系统可以有多个门面
  • 门面不参与子系统内的业务逻辑
  • 门面只是提供一个访问子系统的一个路径,它不应该也不能参与具体的业务逻辑,否则会产生一个倒依赖的问题:子系统必须依赖门面才能被访问。
  • 门面不能常变,而业务常变
  • 解决方法,可以将具体的业务封装在一个类中,封装完毕后提供给门面对象调用。(试下修改代码中的arrange?)
文章目录
  1. 1. 实现代码
  2. 2. 优点
  3. 3. 缺点
  4. 4. 场景
  5. 5. 注意事项
|