C# 程式設計經典300例 實例099 水果的分級採摘和銷售 組合模式
實例099介紹組合模式,組合模式有難度這段目前我看不太懂,只知整體類別呈現樹狀結構可以採用組合模式。
實例描述
範例以水果的分級採摘和銷售的結構為例講解組合模式的使用方法。北京水果總部下面由水果銷售部和水果採摘分部組成,而水果銷售分部下面又包括北京東城區和西城區的具體銷售部門,水果採摘分部包含海淀區的果農和朝陽區的果農。範例使用組合模式來描述這種樹形結構。
輸出「北京水果總部」、「北京水果銷售分部」、「東城區的水果銷售者銷售水果!」、「西城區的水果銷售者銷售水果!」、「北京水果採摘分部」、「海淀區的果農採摘水果!」、「朝陽區的果農採摘水果!」
實現過程
//抽象地區類
public abstract class Area
{
protected string name;
public Area(string name) { this.name = name ;}
public abstract void Add(Area area);
public abstract void Remove(Area area);
public abstract void Perform();
}
//果農類
public class Orchardist:Area
{
public Orchardist(string name) :base(name) {}
public override void Add(Area area);
public override void Remove(Area area);
public override void Perform()
{
Console.WriteLine(“{0}的果農採摘水果!”, name);
}
}
//水果銷售類
public class FruitSeller:Area
{
public FruitSeller(string name) :base(name) {}
public override void Add(Area area);
public override void Remove(Area area);
public override void Perform()
{
Console.WriteLine(“{0}的水果銷售者銷售水果!”, name);
}
}
//具體區域類
public class ConcreteArea:Area
{
List<Area> areas = new List<Area>();
public ConcreteArea(string name) :base(name) {}
public override void Add(Area area)
{
areas.Add(area);
}
public override void Remove(Area area)
{
areas.Remove(area);
}
public override void Perform()
{
Console.WriteLine(name);
foreach (var area in areas)
{
area.Perform();
}
}
}
main函數代碼如下:
Area bjArea = new ConcreteArea(“北京水果總部”);
Area hzSeller = new ConcreteArea(“北京水果銷售分部”);
Area hzOrchardist = new ConcreteArea(“北京水果採摘分部”);
bjArea.Add(hzSeller );
bjArea.Add(hzOrchardist );
hzSeller.Add(new FruitSeller(“東城區”));
hzSeller.Add(new FruitSeller(“西城區”));
hzOrchardist.Add(new Orchardist(“海淀區”));
hzOrchardist.Add(new Orchardist(“朝陽區”));
代碼解析
抽象類Area是所有節點元素的基類。
衍生類別Orchardist 與FruitSeller 是樹形結構的葉子節點。
衍生類別ConcreteArea,表示樹形結構的中間節點。Area集合用於存放子節點,可以是葉子節點或是中間節點。調用Perform方法的同時會調用所有子節點的Perform方法。Area類中有Add方法和Remove方法添加刪除子節點。
通過Orchardist類別、 FruitSeller類別、 ConcreteArea類別可以建構一個完整的樹形結構。
組合模式的主要功能是將具有層級結構關係的類別實例組合成樹狀結構,並且提供一致的訪問介面。
留言
張貼留言