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方法擴展的開放和修改的封閉。


 


適配器模式與裝飾者模式都是對類的功能進行修改,適配器模式實現對類的介面形式修改而不改變其功能,裝飾者模式的目的是改變類的方法功能而不改變介面的形式。


 


 


留言

這個網誌中的熱門文章

異世界NTR web版第三章 觀後感 喧賓奪主 ,反派實力過強

持有縮小技能的D級冒險者,與聖女結婚並加入勇者團隊 漫畫 01-04 觀後感 大我與小我

泛而不精的我被逐出了勇者隊伍 web第三章 觀後感 菲莉真能打; 露娜超爽der