C# 程式設計經典300例 實例096 果園改進種植方法 裝飾者模式
實例096介紹裝飾者模式,說到裝飾者模式讓人聯想《聖鬥士星矢》的黃金聖衣,穿上聖衣會變強。
實例描述
裝飾者模式主要用於給類添加額外的功能擴展,可用一個類或多個裝飾類來擴展類的方法。
範例果園在種植水果之後,還要替果樹鬆土澆水,範例用裝飾者模式對種植方法進行擴展。
輸出「種植蘋果樹」、「為果樹鬆土」、「為果樹澆水」。
實現過程
//抽象水果類
public abstract class Fruit
{
public abstract void Plant();
}
//蘋果類
public class Apple:Fruit
{
public override void Plant()
{
Console.WriteLine(“種植蘋果樹”);
}
}
//水果抽象裝飾者
public abstract class FruitDecorator:Fruit
{
protected Fruit fruit;
public FruitDecorator(Fruit fruit)
{
this.fruit = fruit;
}
public override void Plant()
{
if( this.fruit != null) this.fruit.Plant();
}
}
//鬆土裝飾者
public class LoosenSoilDecorator:FruitDecorator
{
public LoosenSoilDecorator(Fruit fruit) : base(fruit) {}
public override void Plant()
{
base.Plant();
Loosen();
}
private void Loosen()
{
Console.WriteLine(“為果樹鬆土!”);
}
}
//灌溉裝飾者
public class ManureDecorator:FruitDecorator
{
public ManureDecorator(Fruit fruit) : base(fruit) {}
public override void Plant()
{
base.Plant();
Manure();
}
private void Manure()
{
Console.WriteLine(“為果樹澆水!”);
}
}
main函數代碼如下:
Fruit myClass = new Apple();
FruitDecorator Loosen = new LoosenSoilDecorator(myClass );
FruitDecorator Manure = new ManureDecorator(Loosen);
Manure.Plant();
代碼解析
裝飾模式中滿足了用組合代替繼承的原則,以及開放封閉原則。範例中FruitDecorator 類與Fruit 類通過組合關係擴展Plant方法,Fruit 實現了對Plant方法擴展的開放和修改的封閉。
適配器模式與裝飾者模式都是對類的功能進行修改,適配器模式實現對類的介面形式修改而不改變其功能,裝飾者模式的目的是改變類的方法功能而不改變介面的形式。
留言
張貼留言