组合模式
using System;
using System.Collections.Generic;
namespace Composite
{
//抽象地区类
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();
}
}
}
class Program
{
static void Main(string[] args)
{
Area bjArea = new ConcreteArea("--北京水果总部--"); //创建北京水果总部实例
Area hzSeller = new ConcreteArea("---北京水果销售分部---"); //创建北京水果销售分部实例
Area hzOrchardist = new ConcreteArea("---北京水果采摘分部---"); //创建北京水果采摘分部
bjArea.Perform();
bjArea.Add(hzSeller); //添加北京水果销售分部
bjArea.Add(hzOrchardist); //添加北京水果采摘分部
hzSeller.Add(new FruitSeller("东城区")); //添加东城区
hzSeller.Add(new FruitSeller("西城区")); //添加西城区
hzSeller.Perform();
hzOrchardist.Add(new Orchardist("海淀区")); //添加海淀区
hzOrchardist.Add(new Orchardist("朝阳区")); //添加朝阳区
hzOrchardist.Perform();
Console.ReadKey();
}
}
}
代码解析:
本实例代码实现了组合模式,首先创建了抽象类Area,该类是所有节点元素的基类;然后创建了Area类的派生类Orchardist和FruitSeller,这两个类主要是树形结构的叶子节点;还创建了Area类的派生类ConcreteArea,该类表示的是树形结构的中间节点,该类中含有Area的集合,用于存放其子节点,其子节点可以是叶子节点,也可以是中间节点,在调用其 Perform方法的同时还会调用其所有子节点的Perform方法。Area类中还有Add方法和Remove方法为其添加和删除子节点。通过Orchardist类、FruitSeller类和ConcreteArea类可以构建一个完整的类的树形结构。这就是组合模式。
说明:
组合模式的主要功能是将具有层级结构关系的类实例组合成树形结构,并提供一致的访问接口。