修飾模式

修飾模式,是面向對象編程領域中,一種動態地往一個類中添加新的行為的設計模式。就功能而言,修飾模式相比生成子類更為靈活,這樣可以給某個對象而不是整個類添加一些功能。

基本介紹

  • 中文名:修飾模式
  • 外文名:Decorator pattern
介紹,動機,套用,

介紹

通過使用修飾模式,可以在運行時擴充一個類的功能。原理是:增加一個修飾類包裹原來的類,包裹的方式一般是通過在將原來的對象作為修飾類的構造函式的參數。裝飾類實現新的功能,但是,在不需要用到新功能的地方,它可以直接調用原來的類中的方法。修飾類必須和原來的類有相同的接口。
修飾模式是類繼承的另外一種選擇。類繼承在編譯時候增加行為,而裝飾模式是在運行時增加行為。
當有幾個相互獨立的功能需要擴充時,這個區別就變得很重要。在有些面向對象的程式語言中,類不能在運行時被創建,通常在設計的時候也不能預測到有哪幾種功能組合。這就意味著要為每一種組合創建一個新類。相反,修飾模式是面向運行時候的對象實例的,這樣就可以在運行時根據需要進行組合。一個修飾模式的示例是JAVA里的Java I/O Streams的實現。

動機

例如,一個視窗系統中的視窗,允許這個視窗內容滾動,我們希望給它添加水平或垂直滾動條。假設視窗通過“Window”類實例來表示,並且假設它沒有添加滾動條功能。我們可以創建一個子類“ScrollingWindow”來提供,或者我們可以創建一個ScrollingWindowDecorator來為已存在的Window對象添加這個功能。在這點上,只要是解決方案就可以了。 現在我們假設希望選擇給我們的視窗添加框線,同樣,我們的原始Window類不支持。ScrollingWindow子類現在會造成一個問題,因為它會有效的創建一種新的視窗。如果我們想要給所有視窗添加框線,我們必須創建WindowWithBorderScrollingWindowWithBorder子類。顯然,這個問題由於被添加類而變得更糟了。對於修飾模式,我們簡單的創建一個新類BorderedWindowDecorator,在運行時,我們能夠使用ScrollingWindowDecoratorBorderedWindowDecorator或兩者結合來修飾已存在的視窗。 一個修飾能夠被套用的另一個好例子是當有需要根據某套規則或者幾個平行的規則集(不同的用戶憑據等)限制訪問對象的屬性或方法時。
一個對象的屬性或方法按照某組規則或幾個並行規則(不同用戶證書等)需要限制訪問時,在這種情況下,不是在原始對象中實現訪問控制而是在他的使用中不變或不知道任何限制,並且他被包裝在一個訪問控制修飾對象中,這個對象能夠對允許的原始對象的接口子集服務。

套用

Java IO 流為典型的裝飾模式。

相關詞條

熱門詞條

聯絡我們