Domanda

Qualcuno può farmi sapere alcune situazioni di esempio in cui Template Method - deve essere usato modello

Dammi un po 'uso nel mondo reale dalla vostra esperienza.

(finora ho trovato utile solo per i dati di mappatura del livello di DA. Ci dispiace !!!)

È stato utile?

Soluzione

Ho cercato di darvi alcuni esempi reali, e alcune situazioni comuni in cui deve essere utilizzato modello Template Method.

  • Quando si desidera che il programma di essere "aperta per l'estensione” e anche ‘Chiuso per modifica’. Ciò significa che il comportamento del modulo può essere esteso, in modo che possiamo fare la modulo si comportano in modi nuovi e diversi come le esigenze del cambiamento di applicazione, o per soddisfare le esigenze delle nuove applicazioni. Tuttavia, il codice sorgente di un tale modulo è inviolabile. a nessuno è permesso di fare modifiche al codice sorgente ad esso. in seguito ad esempio, è possibile aggiungere nuove modalità di calcolo del salario (come la classe in remoto) senza cambiare i codici precedenti.

    public abstract class Salary {
    
       public final void calculate() {
            System.out.println("First shared tasks is done.");
            getBaseSalary();
            System.out.println("Second shared tasks is done.");
       }
    
       public abstract void getBaseSalary();
    
    }
    
    public class Hourly extends Salary {
    
        @Override
        public void getBaseSalary() {
            System.out.println("Special Task is done.");
        }
    
    }
    
    public class Test {
    
        public static void main(String[] args) {
            Salary salary = ....
            salary.calculate();
        }
    }
    
  • Quando si faccia molti stessa linea di codici che sono duplicati attraverso rinviando solo alcuni passi del vostro algoritmo. quando si implementa il contenuto di un metodo o una funzione si possono trovare alcuni sezione del tuo codice che variano da un tipo ad un altro tipo. La caratteristica di questa sezione è che si può ridefinire o modificare queste sezioni di un metodo o una funzione senza cambiare (metodo o funzione) dell'algoritmo struttura principale. Per esempio, se si vuole risolvere questo problema senza questo motivo si dovrà affrontare questo esempio:

function0: function1: ... funzione personalizzataN:

1       1               1
2       2               2
...     ...             ...
5       6               n
3       3               3
4       4               4
...     ...             ...

Come si può vedere, la sezione merluzzi 5, 6, n sono diversi variano da una funzione ad un'altra funzione, le sezioni tuttavia avete condivisi come 1,2,3,4 che sono duplicati. Consente di prendere in considerazione una soluzione con una delle librerie Java famosi.

public abstract class InputStream implements Closeable {

    public abstract int read() throws IOException;

    public int read(byte b[], int off, int len) throws IOException {
        ....

        int c = read();
        ....
    }

    ....

}

public class ByteArrayInputStream extends InputStream {  

    ...

    public synchronized int read() {
        return (pos < count) ? (buf[pos++] & 0xff) : -1;
        }
    ...
}
  • Quando si come designer di un quadro, desidera che i vostri clienti solo di utilizzare qualsiasi codice eseguibile che viene passato come argomento al quadro, che si prevede di richiamare (eseguire) che l'argomento a un dato tempo. Questa esecuzione può essere immediata come in un callback sincrono, o potrebbe accadere in un secondo momento come in un callback asincrono. Consente di prendere in considerazione uno di quelli famosi.

    public abstract class HttpServlet extends GenericServlet 
        implements java.io.Serializable  {
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
            ...
        }
    
    protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
            ....
            doGet(req, resp);
            ...
        }
        ...
    }
    }
    
    public class MyServlet extends HttpServlet {
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    
                //do something
            ...
        }
        ...
    }
    

Altri suggerimenti

Template metodo modello fornisce uno scheletro per eseguire qualsiasi tipo di algoritmo o un'operazione, e permette le sottoclassi di ri-definire parte della logica.

Pro: scelta naturale per i quadri di costruzione, in modo che le classi del framework genitore possono fare le richiamate in metodi implementati nel bambino

.

Esempi:

  • java.util.AbstractList
  • doGet e doPost di Servlet metodi
  • metodo onMessage MDB
  • classe Struts Azione
  • classi di accesso ai dati di primavera

Contro:. Si limita a una sola eredità in Java

Il ricorso di Template Method modello ha due caratteristiche principali:

  1. C'è una classe di base (in Java, uno solo con i costruttori protected ed eventualmente dichiarati come abstract) che sarà sottoclassi nel codice client.
  2. Non ci sono due gruppi di metodi definito nella classe base: a) uno o più metodi di template (in genere solo uno) e uno o più operazione primitiva metodi (in genere più di uno). Ogni metodo modello rappresenta un'operazione ad alto livello, implementato nella classe base stessa in termini di operazioni primitive, che sono destinate ad essere attuate / sovrascritto in ogni sottoclasse specifica. Normalmente, il metodo modello è pubblica e non-override (final, in Java); la documentazione API deve specificare esattamente quali primitivi metodi di funzionamento si chiama, e quando (cioè, deve descrivere il "algoritmo"). Un metodo di funzionamento primitivo, che rappresenta un passo nell'algoritmo, dovrebbe essere non pubblico, ma override (protected, in Java), e può essere di due tipi: a) un metodo astratto che deve essere implementato nella sottoclasse; b) un metodo con un / implementazione vuoto default che potrebbe essere sovrascritto nella sottoclasse.

Un buon esempio in Java 6 SDK è il metodo execute() della classe javax.swing.SwingWorker (si tratta di un metodo di public final void). In questo caso, i metodi di funzionamento primitive sono doInBackground(), process(List) e done(). Il primo è estratto e quindi necessita di attuazione nella sottoclasse; si chiama con il metodo del modello in un thread in background. Gli altri due hanno implementazioni vuote e possono opzionalmente essere forzati nella sottoclasse; essi sono chiamati durante e alla fine del trattamento, rispettivamente, nel EDT (Swing Event spedizione Thread), per consentire gli aggiornamenti all'interfaccia utente.

Nella mia esperienza, ho a volte usato questo modello. Uno di questi casi è stata una classe base Java che implementa l'interfaccia java.util.Iterator, dove next() era il metodo modello e c'era solo un metodo di funzionamento primitivo responsabile di un'istanza di una specifica classe di entità del dominio (questo è stato pensato per essere utilizzato quando l'iterazione di un elenco di dominio persistente oggetti entità, utilizzando JDBC). Un esempio migliore in quella stessa applicazione era una classe di base in cui il metodo modello implementato un algoritmo multi-step destinata a popolare un "schermata di manutenzione entità di business" (usando Swing) da un determinato elenco delle entità persistenti; Metodi operazioni primitive sono stati chiamati a 1) cancellare lo stato corrente dello schermo, e 2) aggiungere un'entità in una vista tabella all'interno dello schermo; opzionalmente, altre operazioni primitive sono stati chiamati dal metodo modello se lo schermo era modificabile.

Alla fine, devo dire che, anche se questo è certamente un modello di progettazione utile, non così spesso una situazione in cui viene in su è davvero applicabile. Basta avere una classe base con i metodi che vengono sovrascritte in una sottoclasse (una situazione molto più comune, nella mia esperienza) non è sufficiente, di per sé, a qualificarsi come un'applicazione del modello.

La cosa più importante nel modello di metodo è che si deve definire una serie di metodi astratti come gradini o un algoritmo e lasciare che il sostituto sub classe con la concreta attuazione di tali metodi.

Ho applicato in uno dei programma di generazione di documenti.

public abstract DocumentGenerator() 
{
   generateHeader();
   generateBody();
   generateDetails();
}
public HTMLDocGenerator : DocumentGenerator()
{
   public override generateBody()
   {
     //generate as in html format
   }
}

Si può avere applicazione diversa, come generatore di PDF generatore CSV e il valore qui è che Comform all'algoritmo (generare -> intestazione, corpo, i dettagli).

Un modello template deve essere utilizzato quando esiste un algoritmo con molte implementazioni. L'algoritmo è definito in una funzione nella classe base e implementazione è realizzata dalla classe base e sottoclassi. Una spiegazione dettagliata di un esempio reale tempo in http://preciselyconcise.com/design_patterns/templatemethod.php

io abbozzo un esempio del mondo reale in cui ho utilizzato alcuni metodi template.

In un ++ applicazione algoritmo di computer vision C il comportamento dell'algoritmo è stato progettato per assumere un paio di sapori di comportamento algoritmo basato su alcune opzioni di lettura in fase di esecuzione in base ad un enum nascosto in un file di configurazione caricato all'avvio. Lo scheletro complessiva dell'algoritmo era identico tranne che per alcuni callback chiave farcite nel bel mezzo di quello che altrimenti sarebbe una sezione identica di codice che sarebbe stato brutalmente duplicato solo per chiamare diverse funzioni a quel livello. Questi callback ho voluto usare sono stati estratti nella classe base metodo di modello e il metodo motivo template impedito tutto ciò che la duplicazione del codice. L'enum abbiamo utilizzato fondamentalmente dettata quello sottoclasse ho istanziato il mio puntatore alla classe base per puntare e dare l'algoritmo sua bit associato di sapore nel comportamento così.

Ora alcune delle motivazioni alla base di questa varietà di sapori dell'algoritmo esecuzione era online vs funzionalità offline di software che controllava il nostro strumento. Il sapore collegato tirato con esso il debug di uscita più ricco / diagnostica e mantenuto un sistema di coordinate locale per alcuni pixel dell'immagine mentre il sapore in linea mantenuto le cose in uno spazio di coordinate assoluto e mantenuto preoccupazioni specifiche allo strumento in esecuzione con tutti i suoi robotica e cosa no. Un altro enum conduce una selezione tra un insieme di classificatori abbiamo usato per qualche apprendimento automatico pure poiché differenti classificatori sono stati formati sotto diversi insiemi di dati che altrimenti scorreva identico attraverso il corpo di codice ma dovevano essere interpretato diversamente in base ad alcune condizioni per quanto che i dati è stato creato.

Credo che questo tipo di caso d'uso ho avuto nata da quello che è stato chiamato il foro al problema centrale.

Ho usato il metodo di modello per il biglietto di logica in cui un certo numero di componenti condivisi stesso processo ma l'implementazione è stata leggermente diversa.

  

Il metodo Template definisce la struttura a scheletro di un algoritmo, ma   si rimette alcuni passaggi e dettagli alle sottoclassi. La struttura e la   flusso dell'algoritmo rimane statico, ma i dettagli delle operazioni sono   differita alle sottoclassi.

Ho usato Template Method modello per preparare il contenuto del documento. Ci sono stati molti diversi tipi di documento che ogni tipo ha le sue piccole modifiche. Tuttavia, il processo principale della preparazione di documenti era lo stesso per tutti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top