淺讀《大話設(shè)計(jì)模式》————6、穿什么有這么重要?——裝飾模式
如果不是看到有這么好的一個(gè)設(shè)計(jì)模式,我想我能給的設(shè)計(jì)也就是小菜扮靚第一版。不會(huì)采用第二版的原因是我覺得這樣只會(huì)更冗余更復(fù)雜。如果說穿衣服本身就是人這個(gè)對(duì)象應(yīng)該具有的基本屬性,那么看起來似乎這種設(shè)計(jì)也是合理的。關(guān)鍵是人有很多很多穿法,這樣無休止下去,維護(hù)也是大問題??磥泶虬绮荒芎唵蔚淖鰹橐环N操作,能視為基本操作的只有打扮好了以后展示。如同吃飯可以吃很多不同的東西,吃什么不是基本屬性,而只有消化食物才是。理解起來還是比較簡單的:無論穿什么,穿好了,就統(tǒng)稱服裝,所以是服裝展示;無論吃什么,吃進(jìn)去了就是食物,所以就只剩下消化食物了。
裝飾模式:動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé),就增加功能來說,裝飾模式比生成子類更為靈活[DP]。
我很佩服裝飾模式的設(shè)計(jì),基本的代碼結(jié)構(gòu)無疑讓人眼前一亮:
1、Component類
abstract class Component
{
Public abstract void Operation();
}
2、ConcreteComponent類
Classs ConcreteComponent : Component
{
Public override void Operation()
{
Console.WriteLine("具體對(duì)象的操作");
}
}
3、Decorator類
Abstract class Decorator:Component
{
Protected Component component;
Public void SetComponent(Component component)
{
This.component = component ;
}
Public override void Operation()
{
If( component != null)
{
Component .Operation();
}
}
}
4、ConcreteDecoratorA 類
Class ConcreteDecoratorA : Decorator
{
Private string addedState; //本類獨(dú)有功能,以區(qū)別于ConcreteDecoratorB
Public override void Operation()
{
base.Operation();
addedState = "New State";
Console.WriteLine("具體裝飾對(duì)象A的操作");
}
}
Class ConcreteDecoratorB : Decorator
{
Public override void Operation()
{
Base.Operation();
AddedBehavior();
Console.WriteLine("具體裝飾對(duì)象B的操作");
}
Private void AddedBehavior() //本類獨(dú)有的方法,以區(qū)別于A類
{}
}
5、客戶端代碼
Static void Main(string [] args)
{
ConcreteComponent c = new ConcreteCompenent();
ConcreteDecoratorA d1 = new ConcreteDecoratorA();
ConcreteDecoratorB d2 = new ConcreteDecoratorB();
D1.SetComponent(c);
D2.SetComponent(d1);
D2.operation();
Console.Read();
}
這里用到了面向?qū)ο蟮睦^承的特性,所以在建立一個(gè)對(duì)象后,可以完全獨(dú)立的一步一步的進(jìn)行裝飾,就像一件一件穿衣服似的。難道這樣的設(shè)計(jì)不讓人驚嘆嗎?還有關(guān)鍵的是:“如果只有一個(gè)ConcreteComponent類而沒有抽象的Component類,那么Decorator類可以是ConcreteComponent的一個(gè)子類。同樣道理,如果只有一個(gè)ConcreteDecorator類,那么就沒有必要建立一個(gè)單獨(dú)的Decorator類,而可以把Decorator和ConcreteDecorator的責(zé)任合并成一個(gè)類。”
裝飾模式總結(jié):裝飾模式是為了為已有功能動(dòng)態(tài)的添加更多功能的一種方式。
他把每個(gè)要裝飾的功能放在單獨(dú)的類中,并讓每個(gè)類包裝他所要裝飾的對(duì)象,因此,當(dāng)需要執(zhí)行特定行為時(shí),客戶代碼就可以在運(yùn)行時(shí)根據(jù)需要有選擇地、按順序地使用裝飾功能包裝對(duì)象了[DP]。
裝飾模式很靈活,靈活到裝飾本身并沒有限制順序,大部分時(shí)候,超人那種內(nèi)褲穿在外面的打扮好像不太合時(shí)宜,所以要注意裝飾的順序哦~