只把经常使用的五星的掌握便可。设计模式
外观模式-Facade Pattern【学习难度:★☆☆☆☆,使用频率:★★★★★】函数
深刻浅出外观模式(一):外观模式概述,外观模式结构与实现post
深刻浅出外观模式(二):外观模式应用实例(文件加密模块)学习
深刻浅出外观模式(三):抽象外观类,外观模式效果与适用场景加密
系统愈来愈复杂,但不想让客户看到,对外仍然体现出“简洁”。url
提供了一名“服务员”统一办理这些歌事情。spa
类关系参见: http://www.javashuo.com/article/p-vxxbqupp-bv.html.net
将一个类的对象做为另外一个类的属性;设计
[Aggregation]:集合体,但也只是集合,弱关系 ----> has-a,老师和学生的关系,学生能够属于多位老师;
[Composition]:组合体,必不可少部分,强关系 ----> contain-a,皇帝和妃子的关系,妃子只能属于一位皇帝;
[Generalization]:实现继承;
[Realization]:实现接口;
[Dependency]:仅使用了对方的 “方法”;
要点:
若是是“必要的”,那么就须要在类内“create”了呢。
若是只是“弱弱地使用”,那么“部分“ 能够在外部建立,再以参数形式传入 "总体” 使用。
要点:虽然使用了其余类(SubSystem),但属于“类的属性”,并非在方法内。
class SubSystemA { public void MethodA() { //业务实现代码 } } class SubSystemB { public void MethodB() { //业务实现代码 } } class SubSystemC { public void MethodC() { //业务实现代码 } } class Facade {
# 类只是做为了属性,因此属于 Association private SubSystemA obj1 = new SubSystemA(); private SubSystemB obj2 = new SubSystemB(); private SubSystemC obj3 = new SubSystemC(); public void Method() { obj1.MethodA(); obj2.MethodB(); obj3.MethodC(); } } class Program { static void Main(string[] args) { Facade facade = new Facade(); facade.Method(); } }
abc.ABCMeta 是一个metaclass,用于在Python程序中建立抽象基类。
@abstractmethod 装饰器:其实就是模仿“虚函数”。
详见:[Advanced Python] 15 - Metaclass for ORM
class Server(metaclass=ABCMeta): @abstractmethod def __init__(self): pass 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))
在外观类中,初始化的部分,挂上类钩子;对外API函数,调用这些类的函数钩子。
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()
End.