【設計模式】-裝飾者模式(Wrapper)
阿新 • • 發佈:2019-01-11
實在覺得搜狗輸入法流氓,於是就在剛剛解除安裝掉了。因為搜狗輸入法“慣”出的懶散病也該得到治療了。言歸正傳--“裝飾者模式”
裝飾者模式實際上就是將“父物件”的職責動態地加在“子物件”之上,“子物件”可以根據需要,在本有職責的基礎上新增其他的業務。換句話說,若要拓展功能,裝飾者設計模式比繼承提供了更加富有彈性的解決方案。
它的設計原則一是儘可能多地使用組合,而儘可能少的使用繼承,因為繼承是在編譯時決定的,是一種”靜態“的功能拓展,而應用組合對功能進行拓展,則更富有靈活性。二是似的類對拓展開放而對修改關閉。
裝飾者模式要求,裝飾者與被裝飾者需要有同一超類,其目的是為了讓裝飾者與被裝飾者物件的型別能夠匹配,而絕非是繼承其行為。裝飾者模式將保持介面,並增加物件的職責。
例子:
首先是定義一個介面,即裝飾者與被裝飾者都都需要繼承的一個”超類“,是為了讓裝飾者與被裝飾者物件的型別能夠匹配。
interface Component
{
void Operation();
}
然後是被裝飾者,充當”父物件“這個角色,定義了最基本的功能職責。
class Father : Component { public void Operation() { Console.WriteLine("Base operation."); } }
接下來定義裝飾者,充當”子物件“的這個角色,是對”父物件“定義的基本功能職責的一次擴充,當然,你可以再定義一個”孫子物件“。
class Child : Component { private Component _father; public Child(Component father) { _father = father; } public void Operation() { Console.WriteLine("Before operation."); _father.Operation(); Console.WriteLine("After operation."); } }
我們對於裝飾者模式評析一下
繼承和裝飾者模式都是一種對基本功能的拓展,裝飾者模式比繼承更加的靈活。
可以根據不同的情況將功能進行組合,來達到意想不到的效果。
但裝飾者模式會造成程式碼可讀性降低。也由於所有類都只能實現介面的定義,所以在定製方面有一定的侷限性。