定义:组合多个对象形成树形结构以表示具有部分—整体关系的层次结构。组合模式让客户端可以统一地对待单个对象和组合对象。
组合模式包含如下角色:
抽象构件角色(Component):它可以是接口或抽象类,为叶子组件和容器组件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现。
叶子构件角色(Leaf):表示叶子节点对象,叶子节点没有子节点,实现了在抽象组件类中定义的行为。
容器构件角色(Composite):表示容器节点对象,容器节点包含子节点,其子节点可以叶子节点,也可以是容器节点,提供了一个集合用于存储子节点,实现了在抽象组件类中定义的行为,包括访问及管理子组件的方法。
11.1 透明方式
举例
叶子节点(叶子构建)和非叶子节点(容器构建)
- 抽象构建
public abstract class Conponent
{
protected String name;
public Conponent(String name)
{
this.name = name;
}protected abstract List<Conponent> GetChild();
public abstract void Operation();
public abstract void Add();
public abstract void Remove();}
- 叶子构建
public class Leaf : Conponent
{
public Leaf(String name):base(name)
{}
public override void Add()
{
throw new NotImplementedException();
}
public override void Operation()
{
Console.WriteLine(name);
}public override void Remove()
{
throw new NotImplementedException();
}protected override List<Conponent> GetChild()
{
throw new NotImplementedException();
}
}
- 容器构建
public class Composite : Conponent
{
public Composite(String name) : base(name)
{}
public override void Add()
{
Console.WriteLine("添加叶子节点");
}public override void Operation()
{
throw new NotImplementedException();
}public override void Remove()
{
Console.WriteLine("移除叶子节点");
}protected override List<Conponent> GetChild()
{
Console.WriteLine("返回所有叶子节点");return null;
}
总结:透明方式组合,所有构建必须重新抽象构建声明的所有方法,负责会在运行阶段调用时会抛出异常。
11.2 安全方式
- 抽象构建
public abstract class Conponent
{
protected String name;
public Conponent(String name)
{
this.name = name;
}public abstract void Operation();
}
- 叶子构建
public class Leaf : Conponent
{
public Leaf(String name):base(name)
{}
public override void Operation()
{
Console.WriteLine(name);
}
}
- 容器构建
public class Composite : Component
{
private List<Component> components = new List<Component>();public Composite(String name) : base(name)
{}
public void Add()
{
Console.WriteLine("添加叶子节点");
}public override void Operation()
{
Console.WriteLine(name);
foreach(Component c in components)
{
c.Operation();
}
}public void Remove()
{
Console.WriteLine("移除叶子节点");
}protected List<Component> GetChild()
{
Console.WriteLine("返回所有叶子节点");return null;
}
}
总结:安全方式组合,抽象构建中只声明所有构建中(叶子构建)都有的属性和方法,单个构建(容器构建)所特有的属性和方法则直接在该类中声明并实现。
ps:组合模式中所有构建都继承抽象构建