Allows to add responsibilities dynamically without subclassing
/*
* Attaches additional responisbilities for an object dynamically.
* Allows to add additional behavior without subclassing
*/
namespace Structural.Decorator
{
///
///
public interface IComponent
{
string Operation();
}
///
///
public class ConcreteComponent1 : IComponent
{
public string Operation()
{
return "ConcreteComponent1";
}
}
///
///
public class ConcreteComponent2 : IComponent
{
public string Operation()
{
return "ConcreteComponent2";
}
}
///
///
public abstract class AbstractComponentDecorator : IComponent
{
private IComponent _refToConcreteComponent;
public AbstractComponentDecorator(IComponent concreteComponent)
{
_refToConcreteComponent = concreteComponent;
}
public virtual string Operation()
{
return _refToConcreteComponent.Operation();
}
}
///
///
public class ComponentDecorator1 : AbstractComponentDecorator
{
public ComponentDecorator1(IComponent concreteComponent) : base(concreteComponent) { }
public override string Operation()
{
return "ComponentDecorator1 + " + base.Operation();
}
}
///
///
public class ComponentDecorator2 : AbstractComponentDecorator
{
public ComponentDecorator2(IComponent concreteComponent) : base(concreteComponent) { }
public override string Operation()
{
return "ComponentDecorator2 + " + ExtendedOperation() + " + " + base.Operation();
}
public string ExtendedOperation()
{
return "ExtendedOperation";
}
}
}