Pregunta

Quiero, en javascript, para poner en práctica el método de patrón de plantilla.

Tengo un PropertyDecorator con algunas subclases: OpenButtonDecorator, SeeButtonDecorator y así sucesivamente. Quiero tener en Propiedad decorador de la siguiente función:

var build = function(){
   decorate(); //Abstract in PropertyDecorator, defined in subclasses
   return le.build();
}

¿Cómo puedo conseguir este trabajo escenario? Tal vez he implementado mal la herencia: S (ayuda con eso también :))

Gracias de antemano.

¿Fue útil?

Solución

Javascript es un lenguaje basado en prototipos dinámica mecanografiado. método de la plantilla es un patrón de diseño y por lo tanto independiente del lenguaje, pero su aplicación puede variar a través de idiomas.

En el caso de Javascript, y también en otros idiomas tipos dinámicos, como el rubí, clases abstractas e interfaces no tiene mucho sentido, ya que la vinculación dinámica produce a través de la delegación. (Una llamada de método se propaga a niveles más altos en el árbol de herencia hasta un prototipo puede manejar la petición). Esto, junto con pato-escribir, lo que significa que cualquier método puede ser potencialmente llama en cualquier caso, se evita la necesidad de un contrato explícito, que en lenguajes basados ??en clases se define por los métodos declarados que son visibles en un determinado tipo.

Así que con el fin de implementar el patrón, simplemente llame a un método inexistente en el método de construcción del prototipo de los padres (que el método será la plantilla) y simplemente aplicar ese método en los sublcasses:

function PropertyDecorator()
{
   this.build = function()
   {
      var decoration=this.decorate();
      return "The decoration I did: "+decoration;
   };
}

//we set the parent (those prototype that instances of this class will delegate calls to) 
OpenButtonDecorator.prototype = new PropertyDecorator();
function OpenButtonDecorator()
{
   this.decorate = function()
   {
     return "open button";
   };
}


SeeButtonDecorator.prototype = new PropertyDecorator();
function SeeButtonDecorator()
{
   this.decorate = function()
   {
      return "see button";
   };
}



var decorators=Array(new SeeButtonDecorator(),new OpenButtonDecorator());
for (var decorator in decorators){
    document.writeln(decorators[decorator].build());
}

Un despacho método se produce de esta manera:

  • ¿El ejemplo tiene el método invocado?
    • No -.> Delegado llamada a los padres (que es el prototipo) y repita
    • Si-> Ejecutar cuerpo del método en el contexto del objeto implícito (la que recibe la llamada en el principio).

Por lo tanto, cuando se llama a nueva SeeButtonDecorator (). Build (), en primer lugar, se tratará de ejecutar método de aumento en la instancia. Ya que no está definido en la instancia, el método de invocación será delegada a la instancia primaria, que en este caso prototipo SeeButtonDecorator, éste, no ha conseguido el método ni, por lo que delegar la llamada a la misma de los padres (PropertyDecorator). PropertyDecorator, tiene el método build().

function PropertyDecorator()
{
   this.build = function()
   {
      var decoration=this.decorate();
      return "The decoration I did: "+decoration;
   };
}

Al ejecutarlo, el cuerpo de método build será evaluada en el contexto de la nueva SeeButtonDecorator (). La instancia de sí mismo no tendrá un método decorate(), como se le define en SeeButtonDecorator () función (su prototipo). Bueno, esta vez la llamada se delega en el prototipo ejemplo, cosa que finalmente consiguió un método decorar ():

function SeeButtonDecorator()
{
   this.decorate = function()
   {
      return "see button";
   };
}

El método se ejecutará en el contexto de la instancia de nuevo, y devuelve la cadena, de vuelta en la pila de llamadas caer hasta volver

The decoration I did: see button
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top