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());
代碼解析
訪問者模式將數據結構與數據結構中元素方法的調用進行分離,調用方式改變的時候,不需要修改數據結構本身。
留言
張貼留言