| |
Composite Design Pattern
C# implementation:
//
// Composite pattern.
//
using System;
using System.Collections;
// "Component"
abstract class PageElement
{
protected string name;
// Constructor
public PageElement( string name )
{
this.name = name;
}
// Methods
abstract public void Add(PageElement e);
abstract public void Remove( PageElement e);
abstract public void GetContent();
}
// "Leaf"
class Element : PageElement
{
public Element( string name ) : base( name ) {}
public override void Add( PageElement e )
{
Console.WriteLine("Error. Can't add to leaf");
}
public override void Remove( PageElement e )
{
Console.WriteLine("Error. Can't remove from a leaf");
}
public override void GetContent()
{
Console.WriteLine( "This is content of :" + name );
}
}
// "Composite"
class CompositeElement : PageElement
{
// Fields
private ArrayList elements = new ArrayList();
// Constructor
public CompositeElement( string name )
: base( name ) {}
// Methods
public override void Add( PageElement d )
{
elements.Add( d );
}
public override void Remove( PageElement d )
{
elements.Remove( d );
}
public override void GetContent()
{
Console.WriteLine( "Content from composite object : "+name);
// Display each child element on this node
foreach( PageElement p in elements )
p.GetContent();
}
}
///
/// Summary description for Client.
///
public class Client
{
public static void Main( string[] args )
{
// Create a tree structure
CompositeElement page = new CompositeElement( "Page 1" );
page.Add( new Element( "Tag 1" ));
Element e2 = new Element( "Tag 2" );
page.Add(e2);
page.Add( new Element( "Tag 3" ));
CompositeElement list = new CompositeElement( "List 1" );
list.Add( new Element( "List 1, Tag 1" ) );
list.Add( new Element( "List 1, Tag 2" ) );
page.Add( list );
// Add and remove a PrimitiveElement
page.Remove(e2);
// Recursively display nodes
page.GetContent();
Console.ReadLine();
}
}
|
The results are below:
C:\...cs\Composite\Composite\bin\Debug>Composite.exe
Content from composite object : Page 1
This is content of :Tag 1
This is content of :Tag 3
Content from composite object : List 1
This is content of :List 1, Tag 1
This is content of :List 1, Tag 2
|