Skip to main content

Decorator Pattern

在程式中,我們希望動態地給一個類別增加額外的功能,而不改動原有的程式碼,就可用裝飾模式來進行拓展。

Python的裝飾器,可以是函數,也可以是類別(要有__call__,使其是callable)。

設計要點

  1. 可靈活給一個物件增加職責或拓展功能。
  2. 可增加任意多個裝飾。
  3. 裝飾的順序不同,可能產生不同的效果。

優點

  1. 使用裝飾模式來實現拓展比使用繼承更加靈活,他可以在不創造更多子類別的情況下,將物件的功能加以擴展。
  2. 可以動態地給一個物件附加更多的功能。
  3. 可以用不同的裝飾器進行多重裝飾,裝飾的順序不同,可能產生不同的效果。
  4. 裝飾類別和被裝飾類別可以獨立發展,不會相互耦合;裝飾模式相當餘悸成的一個替代模式。

缺點

與繼承相比,用裝飾的方式拓展功能容易出錯,排錯也更困難。對於多次裝飾的物件,調試尋找錯誤時可能需要逐級排查,較為繁瑣。

使用情境

  1. 有大量獨立的拓展,為支援每一種組合將產生大量的子類別,使得子類別數目呈爆炸性增長時。
  2. 需要動態地增加或撤銷功能時。
  3. 不能採用生成子類別的方法進行擴充時,類別的定義不能用於生成子類別。
note

來源: Python 設計模式 - 羅偉富