Add

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.



Decorator Pattern CD


    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


Decorator Pattern Output