一千萬個為什麽

搜索

如果你不能繼承你想要裝飾的類,你如何實現Decorator模式?


這更像是一個設計問題......如果出現以下情況,您無法進行裝飾設計模式:

1)對象標記為“密封”,意味著您無法從中擴展。 2)或者你想要覆蓋一個方法,但它不是虛擬的。

那你能做什麽?如果您沒有源代碼(如第三方庫),則無法更改類源代碼。

最佳答案

Decorator模式不需要繼承。最簡單的情況是,您要裝飾的對象是否實現了接口。然後你的裝飾者可以簡單地實現相同的接口:

[   IWindow   ]
[ + Draw()    ]
---------------
  |
  +--- [   Window    ]
  |    [ + Draw()    ]
  |
  |
  +--- [ DecoratedWindow ]
       [ + Draw()        ]
       -------------------
         |
         +--- [ BorderDecorator ]
         |
         +--- [ VerticalScrollbarDecorator ]
         |
         +--- [ HorizontalScrollbarDecorator ]

現在你可以這樣做:

IWindow w = new BorderDecorator(
             new HorizontalScrollBarDecorator(
              new VerticalScrollBarDecorator(
               new Window(80, 24))));

// This is a window with a border and scrollbars, even though
// the original Window class has no idea what those are.
w.Draw();

可能的具體細節將取決於您嘗試裝飾的類的確切性質。

轉載註明原文: 如果你不能繼承你想要裝飾的類,你如何實現Decorator模式?

猜你喜歡