一、定義
裝飾者模式:動態地給一個物件新增一些額外的職責,就增加功能來說,Decorator模式比生成子類更為靈活。
Decorator模式的工作原理是:可以建立始於Decorator物件(負責新的功能的物件)終於原物件的一個物件“鏈”。
二、例項:手機螢幕裝飾
2.1 手機
public abstract class Phone { public abstract void Print(); } public class Apple : Phone { public override void Print() { Console.WriteLine("我是蘋果手機"); } }
2.2 裝飾者
這裡的關鍵就是形成一個鏈
public abstract class BaseDecorator : Phone { public Phone phone; public BaseDecorator(Phone p) { phone = p; } public override void Print() { if (phone != null) { phone.Print(); } } }
public class Screen:BaseDecorator { public Screen(Phone p) : base(p) { } public override void Print() { Decorat(); base.Print(); } private void Decorat() { Console.WriteLine("螢幕裝飾."); } } public class Num : BaseDecorator { public Num(Phone p) : base(p) { } public override void Print() { Decorat(); base.Print(); } private void Decorat() { Console.WriteLine("鍵盤裝飾."); } }
2.3 客戶端
//-----------------------裝飾模式--------------------- Decorator.Phone phone = new Decorator.Apple(); Decorator.BaseDecorator screen = new Decorator.Screen(phone); Decorator.BaseDecorator num = new Decorator.Num(screen); num.Print(); Console.ReadKey();
執行時多型,首先有手機而且是一部蘋果手機,接下來我要裝飾這部手機的螢幕(貼個膜?),然後再去在按鍵上做裝飾(貼個鑽?)
當我們執行 按鍵的輸出—>輸出“鍵盤裝飾”—>而後轉入父類的輸出函式—>鍵盤的父類是Screen—>此時執行父類的輸出函式,“螢幕裝飾”—>以此類推直到物件本身
三、總結
裝飾模式將多型在執行時運用得很巧妙,實現了裝飾鏈,從最小到最外層的層層裝飾。這樣的設計可以更好的擴充我們的類的功能。