1. 程式人生 > >【設計模式】-裝飾者模式(Wrapper)

【設計模式】-裝飾者模式(Wrapper)

實在覺得搜狗輸入法流氓,於是就在剛剛解除安裝掉了。因為搜狗輸入法“慣”出的懶散病也該得到治療了。言歸正傳--“裝飾者模式”

裝飾者模式實際上就是將“父物件”的職責動態地加在“子物件”之上,“子物件”可以根據需要,在本有職責的基礎上新增其他的業務。換句話說,若要拓展功能,裝飾者設計模式比繼承提供了更加富有彈性的解決方案。

它的設計原則一是儘可能多地使用組合,而儘可能少的使用繼承,因為繼承是在編譯時決定的,是一種”靜態“的功能拓展,而應用組合對功能進行拓展,則更富有靈活性。二是似的類對拓展開放而對修改關閉。

裝飾者模式要求,裝飾者與被裝飾者需要有同一超類,其目的是為了讓裝飾者與被裝飾者物件的型別能夠匹配,而絕非是繼承其行為。裝飾者模式將保持介面,並增加物件的職責。

例子:

首先是定義一個介面,即裝飾者與被裝飾者都都需要繼承的一個”超類“,是為了讓裝飾者與被裝飾者物件的型別能夠匹配。

    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.");
        }
    }

我們對於裝飾者模式評析一下

繼承和裝飾者模式都是一種對基本功能的拓展,裝飾者模式比繼承更加的靈活。

可以根據不同的情況將功能進行組合,來達到意想不到的效果。

但裝飾者模式會造成程式碼可讀性降低。也由於所有類都只能實現介面的定義,所以在定製方面有一定的侷限性。