Frage

Mein bisheriges Verständnis des Decorator-Musters war, dass man Window mit WindowDecorator, dann in den überschriebenen Methoden, einige zusätzliche Arbeit vor dem Aufruf der Window Implementierung der Methoden erbt. Ähnlich wie folgt:

public class Window
{
    public virtual void Open()
    {
        // Open the window
    }
}

public class LockableWindow : Window // Decorator
{
    public virtual void Open()
    {
        // Unlock the window
        base.Open();
    }
}

Doch im Wesentlichen dieser Hardcodes die Dekoration, so wie würde diese Refactoring Zusammensetzung zu verwenden, anstatt die Vererbung?

War es hilfreich?

Lösung

Sorry, mein C # ist eine ein bisschen (OK, sehr) rostig, so kann es ein paar Syntaxfehler sein, aber die Grundidee ist richtig.

public interface IWindow
{
    void Open();
}

public class Window : IWindow
{
    public virtual void Open()
    {
        // Open the window
    }
}

public class LockableWindow : IWindow
{
    private IWindow _wrappedWindow;

    public LockableWindow(IWindow wrappedWindow)
    {
        _wrappedWindow = wrappedWindow;
    }

    public virtual void Open()
    {
        // TODO Unlock window if necessary
        _wrappedWindow.open();
    }
}

Der Schlüssel, was zu beachten ist die neue IWindow-Schnittstelle; das ist, was Ihnen erlaubt, mit Polymorphismus zu halten.

Andere Tipps

Der Punkt des Dekorierermuster ist ein Objekt mit einigen Funktionalitäten (z.B. Zugabe Pufferung auf einen Strom) in einer Art und Weise zu verbessern, die an den Anrufer transparent ist. Um es am effektivsten zu nutzen, wollen Sie ohne Refaktorierungscode in der dekorierten Implementierung tauschen zu können, was, dass Sie die Vererbungshierarchie impliziert grundsätzlich beibehalten müssen.

Was sind Ihre eigentlichen Anliegen, das heißt, was „dieser Fest-Codes wird die Dekoration“ wirklich? Welche Probleme haben wollen Sie sich vorstellen zu lösen? Es kann sein, dass Dekoration ist nicht ganz der richtige Ansatz ...

Sie haben einfach Ihre LockableWindow einen Konstruktor definieren, die eine Instanz des Typs, Fenster nimmt, dass sie schmücken wird. Sie können auch sie über Eigenschaften tun.

public class Window
{    
  public virtual void Open()    
  {        
   // Open the window    
  }
}

public class LockableWindow // Decorator
{    
  private Window window;

  public LockableWindow(Window w)
  {
     window = w;
  }      

  public virtual void Open()    
  {        
    // Unlock the window        
    window.Open();    
  }
}

Mein Verständnis des Decorator-Muster ist, dass es beabsichtigt ist, eine Laufzeitverbesserung eines Objekts Fähigkeiten zu ermöglichen. In der Wikipedia-Erklärung, konzentrieren sie sich auf eine Komponente Stack für diesen Zweck.

Ich spreche kein C # überhaupt, so ist dies (natürlich) php-ish. Es scheint, dass die richtige Idee wäre:

class image{

     function open(){ ... }

} //end of class

class decoratedImage extends image{

     private goodies=array(); //the alleged 'component stack'

     function addGoodie($item){
          $this->goodies[]=$item;
     }

     function open()}{

          parent::open();
          foreach ($this->goodies as $componentClassName){

               $component=new $componentClassName();
               $component->apply($this);

          }

     }

} //end of class

Oh Erfahrenen, erklären Sie bitte die Verbindung trennen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top