1. 程式人生 > 其它 >使用裝飾器模式拓展基類和直接繼承基類的區別

使用裝飾器模式拓展基類和直接繼承基類的區別

裝飾器(Decorator)通過包裝(不是繼承)的方式向目標物件中動態地新增或刪除功能。在軟體開發中,開發人員一般是通過靜態繼承方式讓子類擴充套件新的行為,這樣做要求子類對父類的繼承是靜態擴充套件,需要知道具體的父型別;而且,當擴充套件功能數量巨大,或有不同的功能組合時,子類數量會急劇增加。使用子類擴充套件的方式,可以向目標型別新增新的功能;但這種新增新功能的方式是靜態擴充套件的,而不是動態變化的。一旦將物件指向具有擴充套件功能的例項時,該物件就無法去除掉擴充套件的功能。

最近讀書,讀到裝飾器模式,有以上這樣一段話,在此記錄一下對於裝飾器模式的理解:

以下是裝飾器模式的類結構圖

我們需要注意的有幾點:

  • 所有的裝飾器物件,都儲存著一個Component型別的物件,所以,在裝飾器內部,如果要拓展功能,呼叫的都是Component介面中定義的操作;
  • 當我們需要將兩個裝飾器(假設為A、B)的拓展功能進行組合時,就可以首先使用一個Component物件來構造A型別的物件,然後將A型別的物件作為Component物件來構造B,由於A和B呼叫的都是Component介面中定義的操作,因此使用A類物件構造B是完全可以的,這樣B型別物件中,就同時擁有的A的拓展功能和B的拓展功能。