定义
组合多个对象形成树形结构以表示具有部分-整体关系的层次结构。
组合模式让客户端可以统一对待单个对象和组合对象。
组合模式又称为“部分-整体”模式,属于对象结构型模式,它将对象组织到树形结构中,可以用来描述整体与部分的关系。
举例
例如:公司部分(包含:人力资源部、分部、财政部等)的组成,像树形结构一样
结构
实现
//用于访问和管理Component的子部件
abstract class Component
{
protected string name;
public Component(string name)
{
this.name = name;
}
//功能
public abstract void Add(Component c);
public abstract void Remove(Component c);
public abstract void Display(int depth);
}
//叶节点对象,叶节点没有子节点
class Leaf: Component
{
public Leaf(string name) : base(name)
{
}
public override void Add(Component c)
{
Console.WriteLine("添加");
}
public override void Display(int depth)
{
Console.WriteLine(new String('-', depth) + name);
}
public override void Remove(Component c)
{
Console.WriteLine("移除");
}
}
//定义枝节点行为
class Composite: Component
{
private List<Component> children = new List<Component>();
public Composite(string name): base(name)
{
}
public override void Add(Component c)
{
children.Add(c);
}
public override void Display(int depth)
{
Console.WriteLine(new String('-', depth) + name);
foreach (Component component in children)
{
component.Display(depth + 2);
}
}
public override void Remove(Component c)
{
children.Remove(c);
}
}
class Program
{
static void Main(string[] args)
{
Composite root = new Composite("root"); //生成树根
root.Add(new Leaf("Leaf A")); //根上叶节点LeafA
root.Add(new Leaf("Leaf B")); //根上叶节点LeafB
Composite comp = new Composite("Composite X"); //根上长出分支CompositeX
comp.Add(new Leaf("Leaf XA")); //分枝 Leaf XA
comp.Add(new Leaf("Lead XB")); //分枝 Leaf XB
root.Add(comp); //添加到根节点上
Composite comp2 = new Composite("Composite XY"); //分枝Composite X长出两个分支Leaf xYA、LeafxYA
comp2.Add(new Leaf("Leaf xYA"));
comp2.Add(new Leaf("Leaf XYB"));
comp.Add(comp2); //将其添加到Composite X分枝上
root.Add(new Leaf("Leaf C")); //根节点长出分枝Leaf C、Leaf D
Leaf leaf = new Leaf("Leaf D");
root.Add(leaf);
root.Remove(leaf); //移除分支Leaf D
root.Display(1); //列出树所有节点
}
}
优点
- (1)组合模式可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,让客户端忽略了层次的差异,方便对整个层次结构进行控制。
- (2)客户端可以一致地使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端代码。
- (3)在组合模式中增加新的容器构件和叶子构件都很方便,无须对现有类库进行任何修改,符合开闭原则。
- (4)为树形结构的面向对象实现提供了一种灵活的解决方案,通过叶子对象和容器对象的递归组合,可以形成复杂的树形结构,但对树形结构的控制却非常简单。
缺点
在增加新构件时很难对容器中的构件类型进行限制。
适用环境
- (1)在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,客户端可以一致地对待它们。
- (2)在一个使用面向对象语言开发的系统中需要处理一个树形结构。
- (3)在一个系统中能够分离出叶子对象和容器对象,而且它们的类型不固定,需要增加一此新的类型。