当Composite pattern
您想要访问节点而不关心它们的类型时,使用更多。您如何访问节点?你在和他们做什么?您的目标是改善维护。仅当您需要将每个节点视为同一个对象时,该模式才适用。
尝试类似以下代码:
public interface IMyNode
{
void Print();
}
public class A : IMyNode
{
public void Print()
{
Console.WriteLine("I am a child of T. A or B");
}
}
public class C : IMyNode
{
public void Print()
{
Console.WriteLine("I am a child of A or B, I am C.");
}
}
public class D : IMyNode
{
public void Print()
{
Console.WriteLine("I am a child of C. I am D.");
}
}
public class CompositeMyNode : IMyNode
{
private readonly List<IMyNode> nodes;
public CompositeMyNode()
{
nodes= new List<IMyNode>();
}
public void Add(IMyNode node)
{
nodes.Add(node);
}
public void AddRange(params IMyNode[] node)
{
nodes.AddRange(node);
}
public void Delete(IMyNode node)
{
nodes.Remove(node);
}
public void Print()
{
foreach (IMyNode childMyNode in nodes)
{
childMyNode.Print();
}
}
}
在这种情况下,我们在每个节点上打印信息,而不关心我们实际拥有哪些节点。
var compositeMyNode = new CompositeMyNode();
var compositeMyNode1 = new CompositeMyNode();
var compositeMyNode2 = new CompositeMyNode();
compositeMyNode1.Add(new A());
compositeMyNode2.AddRange(new A(), new A());
compositeMyNode.AddRange(new C(), compositeMyNode1, compositeMyNode2);
// Will print 4 nodes: A, A, A, C.
compositeMyNode.Print();
示例改编自Wikipedia 文章。另请参阅此stackoverflow 问题以获取有关复合设计模式的更多示例和解释。