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