Pregunta

Mi comprensión anterior del patrón de decorador era que heredaba Window con WindowDecorator , luego, en los métodos anulados, realice un trabajo adicional antes de llamar a la ventana Window < La implementación de / code> de dichos métodos. Similar a lo siguiente:

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

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

Sin embargo, esto esencialmente codifica la decoración, entonces, ¿cómo se refactorizaría para usar composición en lugar de herencia?

¿Fue útil?

Solución

Lo siento, mi C # está un poco (OK, muy) oxidado, por lo que puede haber algunos errores de sintaxis, pero la idea básica es correcta.

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();
    }
}

La clave para notar es la nueva interfaz IWindow ; eso es lo que te permite seguir usando el polimorfismo.

Otros consejos

El objetivo del patrón Decorator es mejorar un objeto con alguna funcionalidad (por ejemplo, agregar almacenamiento en búfer a una secuencia) de manera transparente para la persona que llama. Para usarlo de manera más efectiva, desea poder intercambiar la implementación decorada sin refactorizar el código, lo que básicamente implica que necesita mantener la jerarquía de herencia.

¿Cuál es su preocupación real, es decir, qué hace " esto codifica la decoración " ¿realmente quiso decir? ¿Qué tipo de problemas imagina querer resolver? Puede ser que la decoración no sea el enfoque correcto ...

Simplemente haga que su LockableWindow defina un constructor que tome una instancia del tipo, Window, que decorará. También puedes hacerlo a través de propiedades.

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();    
  }
}

Mi comprensión del patrón decorador es que está destinado a permitir una mejora en tiempo de ejecución de las capacidades de un objeto. En la explicación de Wikipedia, se centran en una pila de componentes para este propósito.

No hablo C # en absoluto, así que esto es (obviamente) php-ish. Parece que la idea correcta sería:

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, experimentados, explique la desconexión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top