昨晚事情實在太多,沒來得及更新。今天要學習的是裝飾者模式(Deocorator Pattern).
裝飾者模式定義:裝飾模式是在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。
裝飾模式包含如下角色:
1.Component (抽象構件)
2.ConcreteComponent(具體構件)
3.Decorator(抽象裝飾類)
4.ConcreteDecorator(具體裝飾類)
類圖
裝飾模式特點(引自百度百科)
實例:
某系統提供了一個數據加密功能,可以對字符串進行加密。最 簡單的加密算法通過對字母進行移位來實現,同時還提供了稍 複雜的逆向輸出加密,還提供了更爲高級的求模加密。用戶先 使用最簡單的加密算法對字符串進行加密,如果覺得還不夠可 以對加密之後的結果使用其他加密算法進行二次加密,當然也 可以進行第三次加密。現使用裝飾模式設計該多重加密系統。
類圖:
抽象構建類 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