Decorator Pattern
Using Decorator pattern, we can attach new behvior to the class at run-time using Composition instead of relying on just inheritance. One thing to note that a decorator should be of same type as concerete component.
Decorator Pattern Example
Here is an example of a Decorator Pattern with 2 decorators. One enhances states while other adds new behavior.

abstract class Component { public abstract void PerformWork(); } class ConcreteComponent : Component { public override void PerformWork() { Console.WriteLine("*** Concrete Component ***"); } } abstract class Decorator : Component { protected Component component; public void SetComponent(Component component) { this.component = component; } public override void PerformWork() { if (component != null) { component.PerformWork(); } } } class ConcreteDecoratorWithNewState : Decorator { private string newState = string.Empty; public string NewState { get { return newState; } } public override void PerformWork() { base.PerformWork(); this.newState = "My new data"; Console.WriteLine("I have " + this.newState); } } class ConcreteDecoratorWithNewBehavior : Decorator { public override void PerformWork() { base.PerformWork(); PerformAddedBehavior(); } void PerformAddedBehavior() { Console.WriteLine("I have My new behavior"); } }
class Program { static void Main(string[] args) { ConcreteComponent cComponent = new ConcreteComponent(); ConcreteDecoratorWithNewState decorator1 = new ConcreteDecoratorWithNewState(); ConcreteDecoratorWithNewBehavior decorator2 = new ConcreteDecoratorWithNewBehavior(); decorator1.SetComponent(cComponent); decorator2.SetComponent(decorator1); decorator2.PerformWork(); Console.ReadKey(); } }
Decorator Pattern Output
