外观模式(Facade Pattern)

定义

“Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher-level interface that makes the subsystem easier to use.(要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。)”

Excerpt From: 秦小波 著. “设计模式之禅(第2版)(华章原创精品).”
分析一下这个定义:外观模式可以理解为外部client与内部之间的交互的统一接口的封装。我们经常会看到一些库文档,有些会有一个叫做hight level interface,就是对于子系统的一层封装是调用更简单。
这样有哪些好处,哪些时候应该考虑使用呢?

  1. 开发初期设计阶段:项目分工明确,每层接口之间都有都可以封装一层外观层,使层与层之间的编码(内部逻辑)不受影响。
  2. 项目开发中期,由于项目越来越复杂,子系统越来越多,产生的子类越来越多,此时引入外观模式提供简单的接口减小依赖
  3. 项目维护阶段,可能项目越来越复杂,导致client与多个子系统交互,此时可以编写外观接口层,统一接口,之后再进行内部的改动。
  4. 当外观接口太多可以分开实现多个外观类接口,而且可以对不同的访问权限设计不同的外观接口,比如:管理员能够访问的外观接口与普通用户的可能不同,此时封装一层简略的外观接口即可,保证了安全性。
  5. 外观接口中不要参与子接口的逻辑功能。
@startuml
@enduml

代码实现

举例:操作系统封装了包括内存管理、文件系统管理、进程管理的模块的服务,此时,对于用户体现的只有操作系统这个界面端,通过代码实现以下样例吧~

from abc import ABCMeta, abstractmethod


class Server(metaclass=ABCMeta):
    @abstractmethod
    def __init__(self):
        super().__init__()

    @abstractmethod
    def boot(self):
        pass

    @abstractmethod
    def kill(self):
        pass


class FileServer(Server):
    def __init__(self):
        super().__init__()

    def boot(self):
        print('{}:{}'.format('FileServer', 'boot'))

    def kill(self):
        print('{}:{}'.format('FileServer', 'kill'))

    def create_file(self, user, name):
        print('user:{}, name:{}'.format(user, name))


class ProcessServer(Server):
    def __init__(self):
        super().__init__()

    def boot(self):
        print('{}:{}'.format('ProcessServer', 'boot'))

    def kill(self):
        print('{}:{}'.format('ProcessServer', 'kill'))

    def create_process(self, user, name):
        print('user:{}, name:{}'.format(user, name))


class OperationSystem():
    def __init__(self):
        self.fs = FileServer()
        self.ps = ProcessServer()
        super().__init__()

    def start(self):
        [i.boot() for i in (self.fs, self.ps)]

    def create_file(self, user, name):
        return self.fs.create_file(user, name)

    def create_process(self, user, name):
        return self.ps.create_process(user, name)


if __name__ == "__main__":
    oper = OperationSystem()
    oper.start()
    oper.create_file('root', 'abc.txt')
    oper.create_process('root', 'windows')

    '''
    打印:
    FileServer:boot
    ProcessServer:boot
    user:root, name:abc.txt
    user:root, name:windows
    '''

知识点

  1. 需要理解外观模式的应用场景,应该经常使用,只是我们可能没有留意,或者特意设计一层接口来
  2. 理解metaclass 元类,创建类的类。参考链接:> https://www.cnblogs.com/Simon... https://www.liaoxuefeng.com/wiki/1016959663602400/1017592449371072

下集预告 享元模式


neilliu
59 声望9 粉丝

coder is coding code snippet,coder change the world!