C# 程式設計經典300例 實例103 果農培育果樹 訪問者模式

       實例103介紹訪問者模式,可先看main函式的內容會比較容易訪問者模式的用途,蘋果與橘子是水果種類,鬆土與澆水是動作,訪問者模式可將水果種類與動作解耦合。


實例描述


範例以不同的果農對不同的果樹進行不同的培育。果園中種植了蘋果樹和橘子樹,有的果農負責鬆土,有的果農進行澆水。果樹種類不同,澆水和鬆土的方法也不同。訪問者模式實現果農對果樹的特殊訪問方式。


輸出字串「培育蘋果樹」、「果農為蘋果樹鬆土」、「培育橘子樹」、「果農為橘子樹鬆土」、「培育蘋果樹」、「果農為蘋果樹澆水」、「培育橘子樹」、「果農為橘子樹澆水」。


實現過程


//抽象果農類


public abstract class Orchardist


{


   public abstract void VisitApple(Apple apple);


   public abstract void VisitOrange(Orange orange);


}


 


//負責鬆土的果農


public class   LoosenOrchardist : Orchardist


{


   public override void VisitApple(Apple apple)


   {


       apple.PlantApple();


       Console.WriteLine(“果農為蘋果樹鬆土”);


   }


   public override void VisitOrange(Orange orange);


   {


       orange.PlantOrange();


       Console.WriteLine(“果農為橘子樹鬆土”);        


   }


}


 


//負責澆水的果農


public class   ManureOrchardist : Orchardist


{


   public override void VisitApple(Apple myClassA)


   {


       myClassA.PlantApple();


       Console.WriteLine(“果農為蘋果樹澆水”);


   }


   public override void VisitOrange(Orange myClassB);


   {


       myClassB.PlantOrange();


       Console.WriteLine(“果農為橘子樹澆水”);        


   }


}


 


//抽象水果類


public abstract class Fruit


{


   public abstract void Accept(Orchardist orchardist);


}


 


//抽象蘋果類


public class Apple : Fruit


{


   public override void Accept(Orchardist orchardist)


   {


       orchardist.VisitApple(this);


   }


   public void PlantApple()


   {


       Console.WriteLine(“培育蘋果樹”);


   }


}


 


//抽象橘子類


public class Orange : Fruit


{


   public override void Accept(Orchardist orchardist)


   {


       orchardist.VisitOrange(this);


   }


   public void PlantOrange()


   {


       Console.WriteLine(“培育橘子樹”);


   }


}


 


//果園類


public class Orchard


{


   List<Fruit> fruits = new List<Fruit>();


   public void Attach(Fruit fruit)


   {


       fruit.Add(fruit);


   }


   public void Detach(Fruit fruit)


   {


       fruit.Remove(fruit);


   }


   public void Accept(Orchardist orchardist)


   {


       foreach (Fruit fruit in fruits)


       {


            fruit.Accept(orchardist);


       }


   }


}


 


main函數代碼如下:


 


Orchard orchard = new Orchard();


orchard.Attach(new Apple());


orchard.Attach(new Orange());


orchard.Accept(new LoosenOrchardist());


orchard.Accept(new ManureOrchardist());


 


代碼解析


 


訪問者模式將數據結構與數據結構中元素方法的調用進行分離,調用方式改變的時候,不需要修改數據結構本身。


 


 


留言

這個網誌中的熱門文章

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

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

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