外观模式提供了一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层接口,让子系统更容易使用。
外观模式将具体的实现从子系统中解耦。
与适配器模式的异同:都可以将多个类接口变成客户期望的一个接口,但主要在于编写他们的意图。
在使用外观模式时,容易导致大量的依赖,因此由必要遵守最少知识的OO原则。
设计原则——“最少知识”原则
该原则告诉我们:要减少对象之间的交互,只留下几个密友。
在该对象的方法内,我们只应该调用属于以下范围的方法:
- 该对象本身
- 做为该对象方法的参数而被传递进来的对象
- 此方法所创建或实例化的任何对象
- 对象的任何组件
采用该原则的缺点:虽然使用该原则会减少对象之间的依赖,减少维护成本,但是,采用这个原则,也会导致更多的‘包装’类被制造出出来,以处理和其他组件的沟通,可能会减低代码运行的性能。
class Car:
engin = None
def __init__(self):
# 初始化发动机
pass
def start(self, key):
# 实例化一个对象
doors = Doors()
# 使用传入的对象的方法
authorized = key.turns()
if authorized:
# 使用自己的对象的方法
self.engin.start()
# 使用自身的方法
self.updateDashboardDisplay()
# 使用实例化的对象的方法
doors.lock()
def updateDashboardDisplay(self):
pass
使用外观模式
书中使用外观模式构造了一个可以一键启动家庭影院的组件。
- 使用组合让外观能够访问子系统中的方法
- 将子系统中的组件整合成一个统一的接口
class HomeTheaterFacade:
amp = None
tuner = None
dvd = None
cd = None
projector = None
lights = None
screen = None
popper = None
def __init__(self, amp, tuner, dvd, cd, projector, screen, lights, poper):
self.amp = amp
self.tuner = tuner
self.dvd = dvd
self.cd = cd
self.projector = projector
self.screen = screen
self.lights = lights
self.popper = poper
def watchMovie(self, movie):
print("开始准备看电影")
self.popper.on()
self.popper.pop()
self.lights.dim(10)
self.screen.down()
self.projector.on()
self.projector.wideScreenMode()
self.amp.on()
self.amp.setDvd(self.dvd)
self.amp.setSurroundSound()
self.amp.setVolume(5)
self.dvd.on()
self.dvd.play(movie)