外观模式

外观模式           # 如何创建单个入口来隐藏系统复杂性


系统会随着演化变得非常复杂,最终形成大量的类和交互,这种情况并不复杂。许多情况下,我们并不想把这种复杂性暴露给客户端。外观设计模式有助于隐藏系统的内部复杂性,并通过一个简化的接口向客户端暴露必要的部分。
本质上外观是在已有复杂系统之上实现的一个抽象层





# coding: utf-8

from enum import Enum
from abc import ABCMeta, abstractmethod

State = Enum('State', 'new running sleeping restart zombie')


class Server(metaclass=ABCMeta):

    @abstractmethod
    def __init__(self):
        self.name = None

    def __str__(self):
        return self.name

    @abstractmethod
    def boot(self):
        pass

    @abstractmethod
    def kill(self, restart=True):
        pass


class FileServer(Server):

    def __init__(self):
        """初始化文件服务进程要求的操作"""
        self.name = 'FileServer'
        self.state = State.new

    def boot(self):
        print('booting the {}'.format(self))
        """启动文件服务进程要求的操作"""
        self.state = State.running

    def kill(self, restart=True):
        print('Killing {}'.format(self))
        """杀死文件服务进程要求的操作"""
        self.state = State.restart if restart else State.zombie

    def create_file(self, user, name, permissions):
        """检查访问权限的有效性、用户权限,等等"""

        print("trying to create the file '{}' for user '{}' with permissions {}".format(name, user, permissions))


class ProcessServer(Server):

    def __init__(self):
        """初始化进程服务进程要求的操作"""
        self.name = 'ProcessServer'
        self.state = State.new

    def boot(self):
        print('booting the {}'.format(self))
        """启动进程服务进程要求的操作"""
        self.state = State.running

    def kill(self, restart=True):
        print('Killing {}'.format(self))
        """杀死进程服务进程要求的操作"""
        self.state = State.restart if restart else State.zombie

    def create_process(self, user, name):
        """检查用户权限、生成PID,等等"""

        print("trying to create the process '{}' for user '{}'".format(name, user))


class OperatingSystem:
    """外观"""

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

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

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

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


def main():
    os = OperatingSystem()
    os.start()
    os.create_file('foo', 'hello', '-rw-r-r')
    os.create_process('bar', 'ls /tmp')


if __name__ == '__main__':
    main()

 

posted @ 2018-12-17 13:47  慕沁  阅读(104)  评论(0)    收藏  举报