刘刚刚的个人博客

HeadFirst 设计模式--外观模式(Facade Pattern)

创建时间:2022-12-18 14:32:06
更新时间:2022-12-18 14:32:06

外观模式将一个或者数个类复杂的一切都隐藏在背后,只露出一个干净的外观

外观模式提供了一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层接口,让子系统更容易使用。

外观模式将具体的实现从子系统中解耦。

与适配器模式的异同:都可以将多个类接口变成客户期望的一个接口,但主要在于编写他们的意图。

在使用外观模式时,容易导致大量的依赖,因此由必要遵守最少知识的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

使用外观模式

书中使用外观模式构造了一个可以一键启动家庭影院的组件。

  1. 使用组合让外观能够访问子系统中的方法
  2. 将子系统中的组件整合成一个统一的接口
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)
我的名片

昵称:shuta

职业:后台开发(python、php)

邮箱:648949076@qq.com

站点信息

建站时间: 2020/2/19
网站程序: ANTD PRO VUE + TP6.0
晋ICP备18007778号