首先,定義一個Person類,相當於是ConcreteComent ,具體的裝飾對象。
[csharp]
namespace 酷MM_
{
class Person
{
public Person()
{ }
private string name;
public Person(string name)
{
this.name = name;
}
public virtual void show()
{
Console.WriteLine("裝扮的 {0}", name);
}
}
其次,定義一個Finery類,相當於是Decorator,一個抽象的裝飾類,繼承於Person。其中包含有實現Component接口的對象。
[csharp]
class Finery : Person
{
protected Person component;
// 給Person進行打扮
public void decorte(Person component)
{
this.component = component;
}
public override void show()
{
if (component != null)
{
component.show();
}
}
之後,是一些具體的裝飾子類,相當於ConcreteDecorator,主要用於增加職責。
[csharp]
class Curlyhair:Finery
{
public override void show()
{
Console.Write("長卷發");
base.show();
}
}
class Sunglasses :Finery
{
public override void show()
{
Console.Write("墨鏡");
base.show();
}
}
class leathercoat : Finery
{
public override void show()
{
Console.Write("皮衣");
base.show();
}
}
class Boot : Finery
{
public override void show()
{
Console.Write("長皮靴");
base.show();
}
}
最後,客戶端顯示代碼:
[csharp]
static void Main(string[] args)
{
Person xc = new Person("酷妹張曉");
//實例化具體裝飾子類
Curlyhair pqx = new Curlyhair();
Sunglasses KK = new Sunglasses();
leathercoat dx = new leathercoat();
Boot km = new Boot ();
KK.decorte(pqx);
dx.decorte(KK);
km.decorte(dx);
pqx.decorte(xc);
km.show();
Console.Read();
}
}
}
這樣,一個留著長長卷發,帶著墨鏡,穿著皮衣,長皮靴,酷酷的張曉就展現在我們眼前了!
裝飾模式,是什麼呢?我們為什麼要使用它呢?
裝飾模式:是指動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。通俗的來說,裝飾模式采用“即時即用”的方式,動態的添加系統的功能。
裝飾模式的應用情況:
1.需要擴展一個類的功能,或給一個類追加附加功能。
2.需要動態地給一個對象增加功能,這就區別於繼承機制(靜態的)。
3.需要增加由一些基本功能的排列組合而產生的非常大量的功能,從而使繼承關系變得不那麼現實。
我們先來了解一下裝飾圖的結構圖:
說明:
1.Decorator模式采用組合而非繼承的方法,在運行時動態的給對象添加和擴展功能,這樣就避免了繼承機制靈活性差的缺點,也不會導致類的個數急劇增加。
2.Component類在Decorator模式中充當抽象接口的角色,不去實現具體的行為。Decorator類是從外部來擴展Component類的功能,但對於Component來說,是無需知道Decorator的存在的。
3,ConcreteDecorator 是具體的裝飾類,用於為ConcreteComponent增加職責。
裝飾模式的特點:
1.裝飾對象和真實對象有相同的接口,這樣客戶端對象就可以和真實對象的相同方式和裝飾對象交互。
2.裝飾對象包含一個真實對象的引用。
3.裝飾對象接受所有來自客戶端的請求。它把這些請求轉發給真實的對象。
4.裝飾對象可以在轉發這些請求以前或以後增加一些附加功能。這樣就確保了在運行時不用修改給定對象的結構就可以在外部增加附加的功能。在面向對象中,通常是通過繼承來實現對給定類的功能擴展。