2012-02-11 14 views
12

Il nome (e javadocs) implicano che MouseAdapter è un adattatore (il modello di progettazione). Ma non lo vedo come tale - non adatta nulla a nulla, a prima vista almenoPerché MouseAdapter è un adattatore?

L'unico adattamento che si verifica è che è possibile passare un'istanza di MouseAdapter a qualsiasi metodo che si aspetta uno dei due interfacce. Pertanto, è possibile utilizzare un'istanza MouseListener in cui è previsto solo MouseMotionListener. Ma non c'è nessuna "traduzione" in corso. E non è conforme a UML di GoF - nella versione "adattatore di classe" è previsto che una chiamata a un metodo invochi un metodo dall'adattatore.

Quindi, è un adattatore (modello di progettazione) o è solo un nome casuale che causa confusione?

risposta

12

MouseAdapter prima apparso in Java 1.1 rilasciato in Feb 1997. Ciò significa che è stato sviluppato nel 1996 (o 1995?)

UML (nel progetto) era completed by 1997.

Il primo libro di GoF sugli schemi di progettazione era published in 1995.

Quindi, non credo che l'adattatore in MouseAdapter abbia qualcosa a che fare con il modello di progettazione corrispondente. O, anche se fosse così, gli sviluppatori non avevano un linguaggio unificato per esprimere schemi di progettazione che rendessero molto difficile comprendere il vero significato.

5

Sì, non è un adattatore nel senso del modello GoF perché non adatta nulla. Può essere considerato un esempio di modello astratto di Classe [woolf97]:

La superclasse può fornire una completa implementazione che è un'implementazione di default o minima.

1

Come altre risposte hanno detto, non è un modello di adattatore GoF. Lo scopo principale è quello di abilitare uno per implementare MouseListener (o MouseMotionListener) superando solo i metodi desiderati in MouseAdapter (spesso solo mouseClicked()) piuttosto che dover creare inutili implementazioni vuote di tutti gli altri metodi. Salva quindi un sacco di codice non necessario, soprattutto quando si utilizzano listener di eventi anonimi. Per esempio (tratto da here)

someObject.addMouseListener(new MouseAdapter() { 
     public void mouseClicked(MouseEvent e) { 
      ...//Event listener implementation goes here... 
     } 
    }); 
0

So che c'è già una risposta accettata per questa domanda, ma questa stessa domanda è stato chiesto qui:

MouseAdapter: which pattern does it use?

vedere lì per ulteriori deatils, ma il MouseAdapter adatta l'interfaccia mouseListener molto awkaward in una forma più utilizzabile.

+0

Il problema con questo ragionamento è, come indicano altre risposte, che non esistono adattamenti preesistenti nella situazione MouseAdapter. La motivazione di GoF Adapter (sto citando il libro GoF) è "A volte una classe di toolkit progettata per il riutilizzo non è riutilizzabile solo perché la sua interfaccia non corrisponde all'interfaccia specifica del dominio richiesta da un'applicazione." MouseAdapter è un * adattatore * perché può essere facilmente adattato (personalizzato) per catturare gli eventi del mouse. GoF Adapter dice che hai * una classe * legacy * (toolkit) che non puoi cambiare, in modo da adattare la sua interfaccia alle necessità della tua applicazione. – Fuhrmanator

Problemi correlati