Printed from www.rmfusion.com A Developer website designed for Developers

Composite Pattern Code Review

Code Download

Use the Composite Pattern

Define the IComponent interface to be used as the "blueprint" for the composite and component classes.

public interface IComponent { Boolean Add(IComponent component); Boolean Remove(IComponent component); IComponent Find(String name); String Display(); String Name { get; set; } }

The Album class (object) inherits from the IComponent interface and represents the composite component. This class contains a list of IComponent components.

public class Album : IComponent { public String Name { get; set; } public List<IComponent> Photos { get; private set; }
public Album(String name) { this.Name = name; this.Photos = new List<IComponent>(); }
public bool Add(IComponent component) { this.Photos.Add(component); return (true); } public bool Remove(IComponent component) { IComponent componentFound;
componentFound = this.Find(component.Name);
if (componentFound != null) { this.Photos.Remove(componentFound); return (true); } else { return (false); } } public IComponent Find(String name) { return this.Photos.Find(delegate(IComponent component) { return (component.Name == name); } ); } public string Display() { StringBuilder sb = new StringBuilder(); foreach (IComponent component in this.Photos) { sb.Append(String.Format("Photo: {0}\n", component.Name)); } return(sb.ToString()); } }

The Photo class (object) inherits from the IComponent interface and represents a single component.

class Photo : IComponent { public String Name { get; set; }
public Photo(String name) { this.Name = name; }
public bool Add(IComponent component) { throw new Exception("Cannot add to a Photo."); } public bool Remove(IComponent component) { throw new Exception("Cannot remove Photo directly."); } public IComponent Find(string name) { throw new Exception("Cannot find a Photo."); } public string Display() { return (String.Format("The name of the photo is {0}.", this.Name)); }
public override string ToString() { return this.Name; } }