Composite Pattern
Summary: Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly.
Sample Code
Code
public abstract class Photo
{
protected string name;
public Photo(string name)
{
this.name = name;
}
public abstract void Add(Photo p);
public abstract void Remove(Photo p);
public abstract void Display(int depth);
}
public class SinglePhoto : Photo
{
public SinglePhoto(string name) : base(name) { }
public override void Add(Photo p) => Console.WriteLine("Cannot add to a leaf");
public override void Remove(Photo p) => Console.WriteLine("Cannot remove from a leaf");
public override void Display(int depth)
{
Console.WriteLine(new String('-', depth) + name);
}
}
public class PhotoSet : Photo
{
private List<Photo> _children = new List<Photo>();
public PhotoSet(string name) : base(name) { }
public override void Add(Photo p) => _children.Add(p);
public override void Remove(Photo p) => _children.Remove(p);
public override void Display(int depth)
{
Console.WriteLine(new String('-', depth) + name);
foreach (Photo i in _children)
{
i.Display(depth + 2);
}
}
}
Usage
var lisbonPhotoSet = new PhotoSet("Trip to Lisbon");
lisbonPhotoSet.Add(new SinglePhoto("Belém Tower"));
var alfamaPhotoSet = new PhotoSet("Alfama area");
alfamaPhotoSet.Add(new SinglePhoto("Se Cathedral"));
alfamaPhotoSet.Add(new SinglePhoto("Portas do Sol"));
alfamaPhotoSet.Add(new SinglePhoto("Lisbon Castle"));
alfamaPhotoSet.Add(new SinglePhoto("Casa dos Bicos"));
lisbonPhotoSet.Add(alfamaPhotoSet);
lisbonPhotoSet.Add(new SinglePhoto("Jerónimos Monastery"));
lisbonPhotoSet.Display(0);
Output
Trip to Lisbon
--Belém Tower
--Alfama area
----Se Cathedral
----Portas do Sol
----Lisbon Castle
----Casa dos Bicos
--Jerónimos Monastery
Comments
Post a Comment