组合模式中涉及到三个角色:
- 抽象构件(Component)角色:这是一个抽象角色,下面实现中Graphics充当这个角色,它给参加组合的对象定义出了公共的接口及默认行为,可以用来管理所有的子对象(在透明式的组合模式是这样的)。在安全式的组合模式里,构件角色并不定义出管理子对象的方法,这一定义由树枝结构对象给出。
- 树叶构件(Leaf)角色:树叶对象时没有下级子对象的对象,上面实现中Line和Circle充当这个角色,定义出参加组合的原始对象的行为
- 树枝构件(Composite)角色:代表参加组合的有下级子对象的对象,上面实现中ComplexGraphics充当这个角色,树枝对象给出所有管理子对象的方法实现,如Add、Remove等。
优点:
- 组合模式使得客户端代码可以一致地处理对象和对象容器,无需关系处理的单个对象,还是组合的对象容器。
- 将”客户代码与复杂的对象容器结构“解耦。
- 可以更容易地往组合对象中加入新的构件。
/// <summary>
/// Component 抽象构件角色
/// </summary>
public abstract class Graphics
{
public string Name { get; set; }
public Graphics(string name)
{
Name = name;
}
public abstract void Draw();
}
//树叶构件(Leaf)角色
public class Line : Graphics
{
public Line(string name) : base(name) { }
public override void Draw()
{
Console.WriteLine("画一条:" + Name);
}
}
//树叶构件(Leaf)角色
public class Circle : Graphics
{
public Circle(string name) : base(name) { }
public override void Draw()
{
Console.WriteLine("画一个:" + Name);
}
}
//树枝构件(Composite)角色
public class ComplexGraphics : Graphics
{
public ComplexGraphics(string name) : base(name) { }
public List<Graphics> graphicsList = new List<Graphics>();
public override void Draw()
{
for (int i = 0; i < graphicsList.Count; i++)
{
graphicsList[i].Draw();
}
}
public void Add(Graphics graphics)
{
graphicsList.Add(graphics);
}
public void Remove(Graphics graphics)
{
graphicsList.Remove(graphics);
}
}
public class ClientTest
{
public void Test()
{
ComplexGraphics complexGraphics = new ComplexGraphics("一个复杂的图形");
complexGraphics.Add(new Line("线条1"));
complexGraphics.Add(new Line("线条2"));
complexGraphics.Add(new Circle("圆"));
complexGraphics.Draw();
}
}