名称:组合模式
意图:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。
适用环境:
1、你想表示对象的部分-整体层次结构。
2、你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
abstractclassComponent
{
protectedstringname;
publicComponent(stringname)
{
this.name = name;
}
publicabstractvoidAdd(Componentc);
publicabstractvoidRemove(Componentc);
publicabstractvoidDisplay(intdepth);
}
classComposite: Component
{
privateList<Component> _children = newList<Component>();
publicComposite(stringname)
: base(name)
{
}
publicoverridevoidAdd(Componentcomponent)
{
_children.Add(component);
}
publicoverridevoidRemove(Componentcomponent)
{
_children.Remove(component);
}
publicoverridevoidDisplay(intdepth)
{
Console.WriteLine(newstring('-', depth) + name);
foreach(Componentcomponent in_children)
{
component.Display(depth + 2);
}
}
}
classLeaf: Component
{
publicLeaf(stringname)
: base(name)
{
}
publicoverridevoidAdd(Componentc)
{
Console.WriteLine("Cannot add to a leaf");
}
publicoverridevoidRemove(Componentc)
{
Console.WriteLine("Cannot remove from a leaf");
}
publicoverridevoidDisplay(intdepth)
{
Console.WriteLine(newstring('-', depth) + name);
}
}
调用:
Compositeroot = newComposite("root");
root.Add(newLeaf("Leaf A"));
root.Add(newLeaf("Leaf B"));
Compositecomp = newComposite("Composite X");
comp.Add(newLeaf("Leaf XA"));
comp.Add(newLeaf("Leaf XB"));
root.Add(comp);
root.Add(newLeaf("Leaf C"));
//add and remove a leaf
Leafleaf = newLeaf("Leaf D");
root.Add(leaf);
root.Remove(leaf);
root.Display(1);
输出:
-root
---Leaf A
---Leaf B
---Composite X
-----Leaf XA
-----Leaf XB
---Leaf C