只把經常使用的五星的掌握便可。設計模式
外觀模式-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.