6.6 裝扮模式總結
裝飾模式把每個要裝飾的功能放在單獨的類中,并讓這個類包裝它所要裝飾的對象,因此,當需要執行特殊行為時,客戶端代碼就可以在運行時根據需要有選擇地、按順序地使用裝飾功能包裝對象了。
裝扮模式是為已有功能動態地添加更多功能的一種方式。
裝飾模式的優點:
有效地把類的核心職責和裝飾功能區分開了(將裝飾功能從類中移除,簡化了原有的類)。而且可以去除相關類中重復的裝飾邏輯(具體的裝飾類都繼承了抽象裝飾類)。
需要注意的問題:
裝飾模式的順序很重要,比如加密數據和過濾詞匯都可以是數據持久化(存儲)以前的裝飾功能,但若先加密了數據再用過濾功能就會出問題了,最理想的情況,是保證裝飾類之間彼此獨立,這樣它們就可以以任意的順序進行組合了。
6.4 裝飾模式
裝飾模式,動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。
基本的實現代碼:
Component 類:
abstract class Component{public abstract void Operation();}
Component 定義了一個對象接口(抽象類的抽象方法),可以給這些對象動態地添加職責。
ConcreteComponent 類:
class ConcreteComponent : Component{public override void Operation(){Console.WriteLine("具體對象的操作");}}
ConcreteComponent定義了一個具體的對象,也可以給這個對象添加一些職責。
Decorator 類:(抽象的裝飾類,需要繼承定義的對象接口)
abstract class Decorator : Component{protected Component component;public void SetComponent(Component component) //設置Component {this.component = component;}public override void Operation() //重寫Operation(),實際執行的是Component的Operation() {if(component != null){component.Operation();}}}
Decorator,抽象裝飾類,繼承了?Component,從類外面來擴展?Component 類的功能,但對于?Component 來說,是無需知道?Decorator 的存在的。
具體的裝飾類:
class ConcreteDecoratorA : Decorator{private string addedState; //本類的獨有功能,以區別于ConcreteDecoratorBpublic override void Operation(){base.Operation(); //首先運行原Component的Operation(),再執行本類的功能,如addedState,相當于對原Component進行了裝飾addedState = "New State";Console.WriteLine("具體裝飾對象A的操作");}}class ConcreteDecoratorB : Decorator{public override void Operation(){base.Operation(); //首先運行原Component的Operation(),再執行本類的功能,AddBehavitor(),相當于對原Component進行了裝飾 AddBehavitor();Console.WriteLine("具體裝飾對象A的操作");}private void AddBehavitor() //本類獨有的方法,以區別于ConcreteDecoratorA {}}
客戶端代碼:
static void Main(string[] args){ConcreteComponent c = new ConcreteComponent();ConcreteDecoratorA d1 = new ConcreteDecoratorA();ConcreteDecoratorB d2 = new ConcreteDecoratorB();d1.SetComponent(c);d2.SetComponent(d1);d2.Operation(); //裝飾的方法是:首先用ConcreteComponent實例化對象c,然后用ConcreteDecoratorA的實例化對象d1來包裝c,再用ConcreteDecoratorB的對象d2包裝d1,最終執行d2的Operation() Console.Read();}
6.5 裝飾模式的實際應用
“Person” 類(ConcreteComponent)
class Person{public Person(){ }private string name;public Person(string name){this.name = name;}public virtual void Show(){Console.WriteLine("裝扮的{0}", name);}}
服飾類(Decorator)
class Finery : Person{protected Person component;//打扮public void Decorate(Person component){this.component = component;}public override void Show(){if(component != null){component.Show();}}}
具體服飾類(ConcreteDecorator)
class TShirts : Finery{public override void Show(){Console.WriteLine("大T恤 ");base.Show();}}class BigTrouser : Finery{public override void Show(){Console.WriteLine("垮褲 ");base.Show();}}
客戶端代碼
static void Main(string[] args){Person xc = new Person("小菜");Console.WriteLine("\n第一種裝扮:");BigTrouser kk = new BigTrouser(); //垮褲TShirts dtx = new TShirts(); //大T恤 kk.Decorate(xc); //裝扮過程 dtx.Decorate(kk);dtx.Show();Console.Read();}
?