如上图是一个Windows目录结构的截图,我们发现目录里面有文件、文件夹,文件夹下面可以放文件文件夹,但是文件里面不可以放文件和文件夹,这样我们遍历这个目录下所有文件的时候,我们采用递归的方式层层遍历,直到所有文件夹下面的文件都遍历为止。我们这样遍历的时候每次都需要区分是不是文件夹,有些时候客户需要对他们进行一致性的对待,这样我们只有遍历每个节点就行,不需要对其进行区分。
组合模式(Composite Pattern):组合多个对象形成树形结构以表示具有整体-部分关系的层次结构,组合模式让客户端可以统一对待单个对象和组合对象
组合模式的结构
Component(抽象构件):他可以是接口也可以是抽象类,为叶子构件和容器构件对象声明接口,包含子类共有的行为的声明和实现
abstract class Component
{
public abstract void Operation();
public abstract void Add(Component c);
public abstract void Remove(Component c);
public abstract Component GetChild(int i);
}
Leaf(叶子构件):在组合结构中叶子构件是没有子节点,实现抽象构件的所有方法
class Leaf : Component
{
public override void Add(Component c)
{
}
public override Component GetChild(int i)
{
return null;
}
public override void Operation()
{
}
public override void Remove(Component c)
{
}
}
Composite(容器构件):容器节点也包含叶子和容器,它提供一个集合用于存储节点,在业务方法中可以递归调用子节点的业务方法
class Composite : Component
{
private List<Component> list = new List<Component>();
public override void Add(Component c)
{
list.Add(c);
}
public override Component GetChild(int i)
{
return (Component)list[i];
}
public override void Operation()
{
foreach (Component child in list)
{
child.Operation();
}
}
public override void Remove(Component c)
{
list.Remove(c);
}
}