Domanda

che voglio, in javascript, per implementare il modello di metodo di template.

Ho un PropertyDecorator con alcune sottoclassi: OpenButtonDecorator, SeeButtonDecorator e così via. Voglio avere in proprietà decoratore funzione successiva:

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

Come posso ottenere questo lavoro scenario? Forse ho implementato sbagliato l'eredità: S (aiutare in questo anche :))

Grazie in anticipo.

È stato utile?

Soluzione

Javascript è un linguaggio basato sui prototipi dinamica digitato. Template Method è un modello di progettazione e quindi indipendente dalla lingua, ma la sua attuazione può variare tra le varie lingue.

Nel caso di javascript, e anche in altre lingue dinamicamente tipizzati, come Ruby, le classi astratte e le interfacce non ha molto senso, dato che il collegamento dinamico avviene tramite delega. (Una chiamata di metodo viene propagata a livelli superiori nella struttura di eredità fino un prototipo in grado di gestire la richiesta). Questo, in combinazione con l'anatra-tipizzazione, il che significa che qualsiasi metodo può essere potenzialmente chiamato qualsiasi istanza, evita la necessità di un contratto esplicito, che a linguaggi basati sulle classi è definito da quei metodi dichiarati che sono visibili su un certo tipo.

Quindi, al fine di implementare il modello, basta chiamare un metodo inesistente sul metodo di costruzione del prototipo del genitore (che il metodo sarà il modello) e semplicemente attuare tale metodo sui 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 metodo di spedizione avviene in questo modo:

  • Ha l'istanza ha il metodo invocato?
    • No -.> Delegato chiamata al genitore (è prototipo) e ripetere
    • Yes-> Eseguire il metodo corpo nel contesto dell'oggetto implicita (quella che ha ricevuto la chiamata in principio).

Così, quando si chiama nuova SeeButtonDecorator (). Build (), in primo luogo, si tenterà di eseguire il metodo di compilazione per l'istanza. Poiché non è definito nell'istanza, chiamata di metodo sarà delegata all'istanza padre, che in questo SeeButtonDecorator prototipo caso, questo, non ha ottenuto il metodo di nessuno dei due, in modo che delegherà la chiamata ad essa con i genitori (PropertyDecorator). PropertyDecorator, ha il metodo build().

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

Durante l'esecuzione di esso, il corpo di metodo build sarà valutata nel contesto della nuova SeeButtonDecorator (). L'istanza stessa non avrà un metodo decorate(), come è definito nel SeeButtonDecorator () funzione (prototipo). Bene, questa volta la chiamata viene delegata all'istanza prototipo, wich finalmente ottenuto un metodo di decorare ():

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

Il metodo verrà eseguito nel contesto dell'istanza di nuovo, e restituisce la stringa, ricadendo nello stack di chiamate fino a ritornare

The decoration I did: see button
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top