2010-08-24 26 views
6

Ho un'interfaccia - "EventHandler" - che dichiara diversi metodi.Questo è davvero un esempio del modello di adattatore?

public interface EventHandler { 
    void handleEvent1(); 

    void handleEvent2(); 

    void handleEvent3(); 

    void handleEvent4(); 
} 

Ho anche una classe - "EventHandlerAdapter" - che implementa EventHandler. Tuttavia, in realtà non "implementa" nulla. Il punto è, se un'altra classe vuole implementare EventHandler, ma non tutti i suoi metodi, può semplicemente estendere EventHandlerAdapter e sovrascrivere solo i metodi che vuole.

public class EventHandlerAdapter implements EventHandler { 
    public void handleEvent1() {} 

    public void handleEvent2() {} 

    public void handleEvent3() {} 

    public void handleEvent4() {} 
} 

ho visto qualcosa di simile in più di un'occasione. Il nome "EventHandlerAdapter" mi suggerisce che si tratta di un esempio del modello di adattatore ... ma è davvero? Pensavo che il punto di un adattatore fosse tradurre una implementazione esistente in qualcos'altro. Non vedo come questo sia il caso qui.

Se non si tratta di un esempio del modello di adattatore, che cos'è? Sicuramente qualcosa di simile è stato identificato.

risposta

8

No, questo non è un esempio di un modello di adattatore, come definito qui:

http://en.wikipedia.org/wiki/Adapter_pattern

Tuttavia, nella gestione Java Event, l'adattatore termine è spesso usato come lei ha ricordato. Anche se la parola "Adapter" è la stessa in entrambi, non si riferiscono alla stessa cosa. Gli adattatori che compaiono nel pacchetto java.awt.event sono lì per semplificare la creazione di un gestore di eventi che gestisce un solo metodo senza dover scrivere una serie di metodi vuoti. Sono solo lezioni di scelta rapida.

L'API Evento Java ha in genere una denominazione coerente per queste classi. Quando è presente una classe evento SomeEvent, è presente un'interfaccia SomeListener per ascoltare l'evento e una classe SomeAdapter che implementa l'interfaccia listener con metodi vuoti. Non tutti gli eventi hanno tutte e tre queste parti, ma c'è coerenza nella denominazione e nella funzione dei tre.

Nell'esempio che hai fornito, vorrei rinominare la classe EventAdapter per essere coerente con l'API Java esistente.

+0

sì, la coerenza è una buona cosa;) – Bozho

+0

Dopo aver riflettuto, ho deciso che qualcosa come "AbstractEventHandler" è più appropriato. Potrebbe non essere coerente, ma in realtà l'API Java è addirittura coerente? – someguy

+1

@someguy, il nome Abstract * implica che la classe è 'abstract', quindi deve essere _sostanza_scritta per essere utilizzata. Per esempio. Java Collection Framework contiene diverse classi di questo tipo. Mentre in questo caso, la classe è utilizzabile così com'è, e può essere soggetta a sottoclassi. Quindi per me il nome sarebbe fuorviante. –

2

Hai ragione, questo non è un esempio del modello di progettazione dell'adattatore, piuttosto un'implementazione di base banale dell'interfaccia. Lo cambierei a DefaultEventHandler, EmptyEventHandler o GenericEventHandler.

+0

Questo non sarebbe coerente con l'API Java. –

+0

e suppongo che chiameresti le classi Java in modo simile :) (+1) – Bozho

+0

@Erick, ho appena appreso dalle altre risposte su questa convenzione di denominazione - buono a sapersi :-) Continuo comunque a sostenere che ' DefaultEventHandler' et al.è un nome migliore di "EventHandlerAdapter" perché non è ambiguo. Le persone non esperte nelle convenzioni sulla gestione degli eventi Java sono confuse da questo adattatore, mentre IMHO l'altro campo non avrebbe problemi a comprendere un nome di classe * predefinito. È meglio attenersi a una convenzione di denominazione anche se è ambigua o è meglio ripararla? Preferisco quest'ultimo, ma ovviamente altre persone potrebbero avere preferenze diverse. –

2

Hai ragione, non è un esempio di modello di adattatore, ma una convenzione ampiamente adottata ad avere "default vuoto per" chiamato "adattatori"

per le API di interfaccia utente esempio java spesso forniscono tali adattatori per interfacce MouseListener.

2

L'AWT ha molte implementazioni di interfacce che chiamano "Adapter", come "MouseAdapter", "FocusAdapter". E no, non sono implementazioni del modello di adattatore . Sono classi di convenienza, li chiamerei semplicemente stubs.

Problemi correlati