裝飾模式,動態的給一個對象增長一些額外的職責。就增長功能來講,裝飾着模式比生成子類更加靈活。shell
當想給對象添加額外的功能或者想隨意組織對象的功能的時候能夠用裝飾者模式。ide
這個模式的精髓在於裝飾者繼承自要裝飾的對象而且設置本身要裝飾的對象,而後執行要裝飾對象的功能。具體的裝飾者執行完父類裝飾的功能以後還能夠執行本身的功能。this
namespace 裝飾者模式 { // 對應UML中的ConcreteComponent public class Phone { public virtual void Show() { Console.WriteLine( "手機加裝飾:"); } } // 裝飾者 public class PhoneDecorator : Phone { private Phone _phone; public void SetPhone(Phone phone) { this._phone = phone; } public override void Show() { _phone.Show(); } } // 手機鏈裝飾 public class ChainDecorator : PhoneDecorator { public override void Show() { base.Show(); Console.Write("裝飾鏈"); } } // 手機殼裝飾 public class ShellDecorator : PhoneDecorator { public override void Show() { base.Show(); Console.Write("手機殼"); } } // 手機膜裝飾 public class FilmDecorator : PhoneDecorator { public override void Show() { base.Show(); Console.Write("手機膜"); } } public class Client { // 使用方法 public static void Process() { Console.WriteLine(); // 構造手機 Phone phone = new Phone(); // 裝飾鏈 ChainDecorator chain = new ChainDecorator(); chain.SetPhone(phone);// 要裝飾的手機 chain.Show(); Console.WriteLine(); // 裝飾鏈+手機殼+手機膜 ShellDecorator shell = new ShellDecorator(); shell.SetPhone(chain);// 裝飾帶裝飾鏈的手機 FilmDecorator film = new FilmDecorator(); film.SetPhone(shell); film.Show(); } } }
裝飾者模式經過組合而非繼承的方式能夠隨意的組合功能,避免經過繼承增長功能的靈活性差的缺點。而且複合面向對象的設計原則「優先使用組合而非繼承」和「開放-封閉」原則。spa