Jak powinna wyglądać prawidłowa implementacja wzorca dekorator?

0

Mam sobie taki diagram z wikipedii:
757px-Decorator_UML_class_diagram.svg.png
a to jest moja implementacja:

namespace DecoratorPattern
{
    abstract class Component
    {
        public virtual void ComponentMessage()
        {
            Console.WriteLine("Call from Component base class.");
        }
    }
    class ConcreteComponent : Component
    {
        public override void ComponentMessage()
        {
            //base.ComponentMessage();
            Console.WriteLine("Call from ConcreteComponent!");
        }
    }
    abstract class Decorator : Component
    {
        public abstract override void ComponentMessage();
    }
   
    class ConcreteDecorator : Decorator
    {

        private Component _component;
        public ConcreteDecorator(Component component)
        {
            _component = component;
        }
        public override void ComponentMessage()
        {
            //throw new NotImplementedException();
            _component.ComponentMessage();
            Console.WriteLine("I expanded Component thanks for Decorator!");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Component c = new ConcreteComponent();
            c.ComponentMessage();
            if (c is Component)
                Console.WriteLine("true");
            c = new ConcreteDecorator(c);
            c.ComponentMessage();
            if (c is Decorator)
                Console.WriteLine("true");
            else
                Console.WriteLine("false");
            Console.ReadLine();
        }
    }
}
 

czy coś z nią jest nie tak (co?)?
Druga sprawa to czy dla rozszerzenia funkcjonalności obiektu powinno się robić nowy obiekt czy po prostu rozszerzać już istniejący?

PS. Co oznacza "**-**component" na tym diagramie (zwróćcie uwagę na ten myślnik)?

2

'-' oznacza pole prywatne
'+' publiczne

1 użytkowników online, w tym zalogowanych: 0, gości: 1