装饰模式学习总结
目錄
?
裝飾模式
引言
定義
模式類圖
實例
實例描述
實例類圖
代碼實現
模式擴展
透明裝飾模式和半透明裝飾模式
實例
實例描述
實例類圖
代碼實現
總結
模式優點
模式缺點
裝飾模式
引言
裝飾模式是一種用于替代繼承的技術,它通過一種無需定義子類的方式來給對象動態地增加職責,使用對象之間的關聯關系取代類之間的繼承關系。
定義
英文定義:"Attach additional responsibilities? to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality."。
中文定義:動態地給一個對象增加一些額外的職責,就增加對象功能來說,裝飾模式比生成子類實現更為靈活。
享元模式重要等級★★★☆☆ ? ? ? ?? 享元模式難度等級★★★☆☆
模式類圖
裝飾模式包含以下角色:
1.Componnet 抽象構件
2.ConcreteComponent 具體構件
3. Decorator 抽象裝飾類:抽象裝飾類是抽象構件的子類,并且維護一個指向抽象構件的引用,通過改引用可以調用裝飾之前的對象方法。并通過擴展改方法,以達到裝飾的目的。
4.ConcreteDecorator 具體裝飾類?
實例
實例描述
在某圖書管理系統中,書籍類(Book)具有借書方法(BorrowBook)和還書方法(ReturnBook),現需要動態給書籍對象添加凍結方法(Freeze)和遺失方法(Lose)。使用裝飾模式設計該系統。
實例類圖
代碼實現
Book類,定義為接口
interface Book {void BorrowBook(string bookName);void ReturnBook(string bookName); }普通圖書類SimpleBook
class SimpleBook : Book {public void BorrowBook(string bookName){Console.WriteLine("借閱圖書<<{0}>>", bookName);}public void ReturnBook(string bookName){Console.WriteLine("歸還圖書<<{0}>>", bookName);} }抽象裝飾類,定義為抽象類,實現Book接口
abstract class BookDecorator : Book { protected Book book;public BookDecorator(Book book){this.book = book;}public virtual void BorrowBook(string bookName){book.BorrowBook(bookName);}public virtual void ReturnBook(string bookName){book.ReturnBook(bookName);} }具體裝飾類,丟失圖書LoseBook
class LoseBook : BookDecorator {public LoseBook(Book book) : base(book) { }public void Lose(string bookName){Console.WriteLine("<<{0}>>已經遺失!",bookName);} }具體裝飾類,凍結圖書FreezeBook
class FreezeBook : BookDecorator {public FreezeBook(Book book) : base(book) { } public void Freeze(string bookName){Console.WriteLine("《{0}》已經被凍結!",bookName);} }測試代碼
class Program {static void Main(string[] args){SimpleBook b1; b1 = new SimpleBook();b1.BorrowBook("西游記");b1.ReturnBook("西游記");FreezeBook b2 = new FreezeBook(b1);b2.BorrowBook("西游記");b2.ReturnBook("西游記");b2.Freeze("西游記");LoseBook b3 = new LoseBook(b1);b3.BorrowBook("西游記");b3.ReturnBook("西游記");b3.Lose("西游記");Console.ReadKey();} }運行結果
?
模式擴展
裝飾模式的簡化
如果只有一個具體構件類,抽象裝飾類可以作為具體構建類的直接子類,裝飾模式簡化,如下圖所示。
透明裝飾模式和半透明裝飾模式
透明指的是客戶端是否完全針對抽象編程,如前文的實例中,測試代碼聲明為具體構件,因為具體裝飾類添加了新的功能。是半透明的裝飾模式。
透明裝飾模式要求客戶端完全針對抽象編程,這意味著新的具體裝飾類是對原有功能的補充,而不能添加新的,在抽象層沒有定義的功能。下面用一個多重加密的實例來演示透明裝飾模式。
實例
實例描述
編寫一個字符串加密類,用裝飾模式實現可以動態地多重加密。
實例類圖
代碼實現
抽象加密類Cipher
interface Cipher {string Encrypt(string text); }簡單加密類SimpleCipher
class SimpleCipher : Cipher {public string Encrypt(string text){throw new NotImplementedException();} }抽象裝飾加密類CipherDecorator
abstract class CipherDecorator : Cipher {protected Cipher cipher;public CipherDecorator(Cipher cipher){this.cipher = cipher;}public abstract string Encrypt(string text); }復雜加密類ComplexCipher
class ComplexCipher : CipherDecorator {public ComplexCipher(Cipher c) : base(c) { }public override string Encrypt(string text){return ComplexEncrypt(cipher.Encrypt(text));}private string ComplexEncrypt(string text){throw new NotImplementedException();} }高級加密類AdvancedCipher
class AdvanceCipher : CipherDecorator {public AdvanceCipher(Cipher c) : base(c) { }public override string Encrypt(string text){return AdvanceEncrypt(cipher.Encrypt(text));}private string AdvanceEncrypt(string text){throw new NotImplementedException();} }測試代碼
class Program {static void Main(string[] args){string password = "asd123";//初次加密Cipher c = new SimpleCipher(); password = c.Encrypt(password);//使用復雜加密再加密c = new ComplexCipher(c);password = c.Encrypt(password);//使用高級加密再加密c = new AdvanceCipher(c);password = c.Encrypt(password);Console.WriteLine(password);Console.ReadKey();} }運行結果
由于本例中的加密算法實際上未實現,所以不貼出運行結果。讀者可以根據自己喜好實現自己想要的加密算法,將代碼中的throw new NotImplementedException();換成具體的加密算法,使用不同的排列組合就可以達到多次加密的效果!?
?
總結
模式優點
1.用裝飾模式擴展對象的功能,比用繼承的方式更加靈活。
2.可以通過一種動態的方式擴展一個對象的功能,通過配置文件可以在運行時選擇不同的裝飾器沒從而實現不同的行為。
3.通過使用不同的多個具體裝飾類以及這些裝飾類的排列組合,可以創造出很多不同行為的組合。(如加密可以多重加密)
4.具體構件類和具體裝飾類可以獨立變化,用戶可以根據需要增加新的具體構件和裝飾類,在使用的時候再進行組合,原有代碼無需改變,復合開閉原則。
模式缺點
1.使用裝飾模式進行系統設計的時候,會產生很多小對象,這些對象的區別在于他們之間相互連接的方式不同,而不是它們的類或者屬性有所不同,同時還會產生很多具體裝飾類。這將加大系統的復雜度。
2.對于多次裝飾的對象,調試時尋找錯誤需要一層層的排查,較為繁瑣。
總結
- 上一篇: 图像处理知识点总结
- 下一篇: 淘宝爬虫(需要人工扫码一下)