裝飾模式指的是在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。

在Python種實現動態擴展對象功能的方法,最簡單的是通過複寫__getattr__函數,在getattr種寫入我們需要擴展的功能,實例代碼如下:

特點

(1) 裝飾對象和真實對象有相同的介面。這樣客戶端對象就能以和真實對象相同的方式和裝飾對象交互。

(2) 裝飾對象包含一個真實對象的引用(reference)

(3) 裝飾對象接受所有來自客戶端的請求。它把這些請求轉發給真實的對象。

(4) 裝飾對象可以在轉發這些請求以前或以後增加一些附加功能。這樣就確保了在運行時,不用修改給定對象的結構就可以在外部增加附加的功能。在面向對象的設計中,通常是通過繼承來實現對給定類的功能擴展。

設計原則

1. 多組合,少繼承。

利用繼承設計子類的行為,是在編譯時靜態決定的,而且所有的子類都會繼承到相同的行為。然而,如果能夠利用組合的做法擴展對象的行為,就可以在運行時動態地進行擴展。

2. 類應設計的對擴展開放,對修改關閉。

推薦閱讀:

相关文章