2016.12.15學習日記 裝飾者模式

昨晚事情實在太多,沒來得及更新。今天要學習的是裝飾者模式(Deocorator Pattern).


裝飾者模式定義:裝飾模式是在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。

裝飾模式包含如下角色:

1.Component (抽象構件)

2.ConcreteComponent(具體構件)

3.Decorator(抽象裝飾類)

4.ConcreteDecorator(具體裝飾類)


類圖


裝飾模式特點(引自百度百科)

(1) 裝飾對象和真實對象有相同的接口。這樣客戶端對象就能以和真實對象相同的方式和裝飾對象交互。
(2) 裝飾對象包含一個真實對象的引用(reference)
(3) 裝飾對象接受所有來自客戶端的請求。它把這些請求轉發給真實的對象。
(4) 裝飾對象可以在轉發這些請求以前或以後增加一些附加功能。這樣就確保了在運行時,不用修改給定對象的結構就可以在外部增加附加的功能。在面向對象的設計中,通常是通過繼承來實現對給定類的功能擴展。


實例:

某系統提供了一個數據加密功能,可以對字符串進行加密。最 簡單的加密算法通過對字母進行移位來實現,同時還提供了稍 複雜的逆向輸出加密,還提供了更爲高級的求模加密。用戶先 使用最簡單的加密算法對字符串進行加密,如果覺得還不夠可 以對加密之後的結果使用其他加密算法進行二次加密,當然也 可以進行第三次加密。現使用裝飾模式設計該多重加密系統。

類圖:

抽象構建類 Cipher

public abstract class Cipher
    {
        public abstract string encrypt(String plainText);
    }

具體構件類 SimpherCilpher

public class SimpleCipher : Cipher
    {
        public override string encrypt(String plainText)
        {
            String str = "";
            for (int i = 0; i < plainText.Length; i++)
            {
                char c = plainText[i];
                if (c >= 'a' && c <= 'z')
                {
                    c += (char)6;
                    if (c > 'z') c -= (char)26;
                    if(c<'a') c += (char)26;
                }
                if (c >= 'A' && c <= 'Z')
                {
                    c += (char)6;
                    if (c > 'Z') c -= (char)26;
                    if(c<'A') c += (char)26;
                }
                str += c;

            }

            return str;
        }
    }

抽象裝飾類 CipherDecorator

class CipherDecorator : Cipher
    {
        private Cipher cipher;

        public CipherDecorator(Cipher cipher)
        {
            this.cipher = cipher;
        }

        public override String encrypt(String plainText)
        {
            return cipher.encrypt(plainText);
        }

    }

具體裝飾類 ComplexCipher

class ComplexCipher : CipherDecorator
    {
        public ComplexCipher(Cipher cipher):base(cipher)
        {  
        }

        public override string encrypt(string plainText)
        {

            String result= base.encrypt(plainText);
            result = reverse(result);
            return result;
        }

        private string reverse(string text)
        {
            String str = "";
            for(int i=text.Length;i>0;i--)
            {
                str += text.Substring(i-1,1);
            }
            return str;
        }
    }

具體裝飾類 AdvancedCipher

class AdvancedCipher :CipherDecorator
    {
        public AdvancedCipher(Cipher cipher): base(cipher)
        {
        }
        public override string encrypt(string plainText)
        {
            string result =base.encrypt(plainText);
            result=mod(result);
            return result;
        }
        public string mod(string text)
        {
            string str = "";
            for (int i = 0; i < text.Length; i++)
            {
                string c = ((int)text[i] % 6).ToString();
                str += c;
            }
            return str;
        }
    }
Program.cs

class Program
    {
        static void Main(string[] args)
        {
            string pawd = "sunnyLiu";
            string cpasword;
            Cipher pw,cpw,apw;

            pw = new SimpleCipher();
            cpasword = pw.encrypt(pawd);
            Console.WriteLine(cpasword);

            cpw = new ComplexCipher(pw);
            cpasword = cpw.encrypt(pawd);
            Console.WriteLine(cpasword);

            apw = new AdvancedCipher(cpw);
            cpasword = apw.encrypt(pawd);
            Console.WriteLine(cpasword);
            Console.ReadKey();
        }
    }



優點:

裝飾這模式和繼承的目的都是擴展對象的功能,但裝飾者模式比繼承更靈活,並且有很好地可擴展性

通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設計師可以創造出很多不同行爲的組合


缺點:

裝飾者模式會導致設計中出現許多小對象,如果過度使用,會讓程序變的更復雜。並且更多的對象會是的差錯變得困難,特別是這些對象看上去都很像。


使用場景:

需要擴展一個類的功能或給一個類增加附加責任。

需要動態地給一個對象增加功能,這些功能可以再動態地撤銷。

需要增加由一些基本功能的排列組合而產生的非常大量的功能

感覺始終理解不是很深,忘得也快,這該怎麼辦啊~~~~~1

發佈了36 篇原創文章 · 獲贊 2 · 訪問量 9981
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章