什麼是Decorator Pattern?它有何優點和用途?
如何實作一個Decorator?請舉例說明。
如何避免在Decorator主體和被裝飾對像之間的依賴問題?
請舉例說明如何為現有的對象添加新的行為。
Decorator和策略(Pattern)有什麼區別?它們之間如何協同工作?
Decorator Pattern 是指在不改變現有物件結構的情況下,動態地為物件添加功能或修改其行為。它是一種裝飾模式,可在現有的程式碼基礎上自由地添加新的功能模組。
舉例來說,當我們需要一個 Windows 操作系統,但又想要加入一個防毒軟體,這時候便可以使用 Decorator Pattern。這裡的 Windows 操作系統就是基本的 Component,而防毒軟體則是具有攔截惡意文件、即時保護等功能的 Decorator。Decorator 在不改變原有操作系統的情況下為其添加新的功能,同時也能夠為操作系統提供相對應的彈性。
再舉例來說,我們可以使用 Decorator Pattern 對於一個圖形繪製軟件進行擴充,比如可以添加輔助圖形的繪製功能、繪製圖形的屬性調整編輯功能、繪製圖形的美化裝飾效果等等。這些功能可以非常靈活地組合在一起,在使用者繪製圖形的過程中,可以更好地實現柔性繪圖需求。
在實際應用中,Decorator Pattern 可以用於圖形繪製、GUI界面設計、網頁開發、媒體播放器等各種場景。
Decorator Pattern(裝飾者模式)是一種結構型設計模式,重點如下:
它能夠在不改變現有對象結構的情況下,給對像動態地添加新的功能。
裝飾者和被裝飾者具有相同的接口,這樣裝飾者可以使用和被裝飾者相同的方法來加工被裝飾者的輸出。
嵌套式裝飾者的添加可以無限制地進行下去,裝飾者可以堆疊起來,形成一個有層次的嵌套結構。
裝飾者模式提供了一個靈活、動態地添加功能的方式,並且可以在運行時動態地添加、移除裝飾者。
裝飾者模式的使用讓代碼符合「開放封閉原則」,可以方便地擴展和修改現有的功能,且不需要對已有的代碼進行修改。
裝飾者模式常常被用於實現App中的主題、樣式等機能,也常常被應用於I/O流和GUI編程等場景中。
考慮一個製作蛋糕的例子,使用Decorator Pattern來實現添加材料的功能。設計一個Cake接口,並有實現該接口的BaseCake類。然後實現ChocolateDecorator和FruitDecorator,這些裝飾器可以添加巧克力和水果。請編寫一個測試程序以證明這些裝飾器可以正確地添加材料。
實現一個Logger接口和一個FileLogger類,這個類可以在文件中記錄日誌。實現一個Decorator抽象基類,它包含一個指向Logger接口的指針。實現TextLoggerDecorator和HTMLLoggerDecorator,這些裝飾器可以添加文本和HTML格式的日誌記錄。請編寫一個測試程序以證明這些裝飾器可以正確地記錄日誌。
實現一個Shape接口和幾個實現該接口的類,例如Rectangle, Circle和Triangle。實現一個Decorator抽象基類,它包含一個指向Shape接口的指針。實現ColoredShapeDecorator和ThickShapeDecorator,這些裝飾器可以為形狀添加顏色和厚度。請編寫一個測試程序以證明這些裝飾器可以正確地裝飾形狀。
實現一個DataSource接口和一個FileDataSource類,這個類可以讀取和寫入文件。實現一個Decorator抽象基類,它包含一個指向DataSource接口的指針。實現EncryptionDataSourceDecorator和CompressionDataSourceDecorator,這些裝飾器可以對數據進行加密和壓縮。請編寫一個測試程序以證明這些裝飾器可以正確地處理數據。
實現一個Shape接口和幾個實現該接口的類,例如Rectangle, Circle和Triangle。實現一個Decorator抽像基類,它包含一個指向Shape接口的指針。實現RedShapeDecorator和BlueShapeDecorator,這些裝飾器可以修改形狀的顏色。然後實現一個DoubleColorShapeDecorator,它可以將兩種顏色結合在一起,讓形狀變得更加顯眼。請編寫一個測試程序以證明DoubleColorShapeDecorator可以正確地結合兩種顏色。
答案:
設計Cake接口和BaseCake類,然後創建ChocolateDecorator和FruitDecorator裝飾器,並在這些裝飾器中添加材料。
實現Logger接口和FileLogger類,然後實現TextLoggerDecorator和HTMLLoggerDecorator,這些裝飾器可以添加文本和HTML格式的日誌記錄。
實現Shape接口和幾個形狀類,例如Rectangle, Circle和Triangle。然後實現ColoredShapeDecorator和ThickShapeDecorator,這些裝飾器可以為形狀添加顏色和厚度。
實現DataSource接口和FileDataSource類,然後實現EncryptionDataSourceDecorator和CompressionDataSourceDecorator,這些裝飾器可以對數據進行加密和壓縮。
實現Shape接口和幾個形狀類,例如Rectangle, Circle和Triangle。然後創建RedShapeDecorator和BlueShapeDecorator裝飾器,並實現DoubleColorShapeDecorator,這個裝飾器可以將兩種顏色結合在一起。