[Design Patterns] 02. Structural Patterns - Facade Pattern

前言


參考資源

史上最全設計模式導學目錄(完整版)html

只把經常使用的五星的掌握便可。設計模式

   

外觀模式-Facade Pattern【學習難度:★☆☆☆☆,使用頻率:★★★★★】函數

深刻淺出外觀模式(一):外觀模式概述,外觀模式結構與實現post

深刻淺出外觀模式(二):外觀模式應用實例(文件加密模塊)學習

深刻淺出外觀模式(三):抽象外觀類,外觀模式效果與適用場景加密

 

系統愈來愈複雜,但不想讓客戶看到,對外仍然體現出「簡潔」。url

 

 

 

教學


1、基本原理

 提供了一名「服務員」統一辦理這些歌事情。spa

 

 

2、類圖

類關係表示

類關係參見: http://www.javashuo.com/article/p-vxxbqupp-bv.html.net

  • Association:

將一個類的對象做爲另外一個類的屬性;設計

  • 菱形尾巴 + Association:

[Aggregation]:集合體,但也只是集合,弱關係 ----> has-a,老師和學生的關係,學生能夠屬於多位老師;

[Composition]:組合體,必不可少部分,強關係 ----> contain-a,皇帝和妃子的關係,妃子只能屬於一位皇帝;

  • 實虛結合 + 三角 (類) 箭頭:

[Generalization]:實現繼承;

[Realization]:實現接口;

  • 虛化的 Association:  

[Dependency]:僅使用了對方的 「方法」;

 

Aggregation 與 Composition

要點:

若是是「必要的」,那麼就須要在類內「create」了呢。

若是隻是「弱弱地使用」,那麼「部分「 能夠在外部建立,再以參數形式傳入 "總體」 使用。

 

3、外觀模式

外觀模式 UML 

 

外觀模式 Code

要點:雖然使用了其餘類(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(); } }

 

 

 

Facade Pattern in Python 


1、虛基類

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.

相關文章
相關標籤/搜索