Progetta un menu basato su Java in modo che sia più facile aggiungere nuove opzioni

1

Sto provando a creare un programma per console java che visualizza un Menu con poche opzioni. Ogni selezione di opzioni esegue alcune operazioni indipendenti, ad esempio eseguendo uno script o eseguendo alcune operazioni db, ad esempio:

1 option1title  
2 option2title  
3 option3title  
...  

Ho bisogno di progettarlo in modo tale che dovrei essere in grado di aggiungere facilmente nuove opzioni. dì semplicemente aggiungendo una nuova classe. Alcune opzioni potrebbero mostrare anche un sottomenu.

Pensieri di progettazione che ho

Avere un'interfaccia dire IOption con metodi come optionTitle , optionAction . Quindi ogni Option nel menu implementerebbe questa interfaccia e scriverà la sua azione & titolo.

Come faccio a visualizzare il menu?
Posso avere una classe in cui ogni opzione è registrata. Di 'una lista di tutte le opzioni. Quindi il mio programma principale avrebbe iterato su queste classi e mostrato il menu. La selezione delle opzioni chiamerebbe l'azione di quella particolare classe.
Altrimenti posso usare reflection / annotation per ottenere tutte le classi che implementano questa interfaccia e mostrare il menu ---- > Questo potrebbe essere eccessivo.

C'è un modo migliore per progettare questo? Qualche modello di progettazione che posso portare? La mia priorità è un buon design.

Anche con la mia soluzione, se voglio aggiungere una nuova opzione, dovrei registrare ciascuna opzione in un elenco, implementare la classe ecc.
Invece di aggiungere a un elenco nella classe di registro, che ne dici di avere il link tra optionTitle e informazioni sulla classe in un file xml o qualcosa del genere?

E avrò anche dei sottomenu. Oltre a scrivere questo nel metodo itemAction , un modo migliore di progettarlo?

Fammi sapere se devo aggiungere ulteriori informazioni.
Nota: questo sarà sempre invocato dal prompt dei comandi. Prompt dei comandi shell / windows. Non ho bisogno di alcuna GUI per questo.

    
posta Manu Mathew 30.10.2016 - 15:18
fonte

1 risposta

2

Design proposto:

Potresti utilizzare il schema di comando :

  • Un'interfaccia di comando definisce i metodi relativi a un'opzione di menu (comando i.e.). Il metodo più importante qui è optionAction() (corrisponde al metodo execute() del pattern).
  • I comandi concreti sono classi che implementano questa interfaccia: optionAction() viene sovrascritto per definire le azioni che devono essere eseguite per un comando specifico.
  • Quando i comandi concreti vengono istanziati da un client (il tuo main() ?), viene memorizzato un riferimento a un oggetto ricevente. Questo oggetto verrà utilizzato per eseguire l'azione in un secondo momento.
  • Una classe di comando concreta specifica implementa un ciclo di menu come azione. Ma invece di codificare tutti i diversi sottomenu nella propria classe, usa una singola classe SubmenuCommand , le cui istanze faranno riferimento a un oggetto menu che ha un elenco di opzioni (comandi).
  • L'invocatore eseguirà i comandi creati quando necessario. Nel tuo caso, potresti semplificare l'invocatore: il tuo main() in qualche modo invocherà il comando corrispondente al menu di livello superiore. E questo invocherà i comandi scelti.

Varianti di questo design:

Gli oggetti del menu potrebbero essere costruiti durante l'inizializzazione. In genere, utilizzi lo modello di build per inizializzare ogni menu in modo programmatico. Quindi avrebbe senso usare optionTitle() .

Tuttavia, è anche possibile caricare il menu da un file di configurazione. In questo caso, optionTitle() sarebbe inutile: avresti letto quel titolo dal file di configurazione (con la flessibilità di personalizzare il testo e persino la possibilità di localizzare / tradurre i menu). In linea di massima lo faresti nel director del builder, ma se vuoi anche configurare altri comandi, un potrebbe essere considerato anche il modello di metodo di fabbrica .

Se opti per il caricamento dinamico dei menu, ci sono un paio di punti delicati da gestire:

  • prima devi collegare il testo dei menu con le classi di comando. O si usa la riflessione per identificare le classi giuste per nome, o - molto più semplice - si utilizza una mappa che collega le parole chiave corrispondenti ai comandi alle fabbriche specifiche della classe (la mappa sarebbe statica e inizializzata prima che il file di configurazione venga analizzato).
  • dipendenze tra i menu: il modo più semplice sarebbe quello di organizzare i menu in ordine ascendente, in modo da assicurarsi che un menu sia sempre caricato / creato prima di essere richiamato in altri menu. Analogamente alle classi di comando, avresti anche una mappa di menu (la mappa sarebbe dinamica e popolata quando vengono caricati nuovi menu: la struttura del menu potrebbe quindi essere totalmente dinamica e riconfigurabile).

Riassunto:

Qui un modello di classe semplificato che mostra la struttura generale. Lascio comunque il cliente, l'invocatore, il regista e il costruttore fuori da questa figura, in quanto dipende molto dal resto della domanda:

    
risposta data 30.10.2016 - 18:44
fonte