The Composite pattern
is more used when you want to access the nodes and not care about their type. How are you accessing the nodes? What are you doing with them? Your goal is to improve maintenance. The pattern only applies if you need to treat each node as the same object.
Try something like the following code:
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();
}
}
}
In this case we are priting information on each node without caring which nodes we actually have.
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();
Example adapted from the Wikipedia article. Also see this stackoverflow question for further examples and explanations of the composite design pattern.