2012-04-05 5 views
6

Voglio di visualizzare due diversi algoritmi che decidono se c'è sovrapposizione in una collezione di cerchi in un piano in Java:Come visualizzare un algoritmo senza modificare il codice di quell'algoritmo?

  • un algoritmo O (n²) che controlla ogni combinazione di cerchi
  • un O (nlogn) algoritmo utilizzando una linea di sweep

c'è un modo per lasciare che un oggetto di una classe vizualization 'ascoltare' a un oggetto della classe algoritmo in modo che si può per esempio vedere quando l'algoritmo sta eseguendo una sovrapposizione controllare tra una coppia di cerchi e sapere quando aggiornare la visualizzazione?

altro esempio: Posso mantenere l'elenco dei cerchi attivi (quelli che intersecano la linea di sweep) come una variabile dell'algoritmo della linea di scorrimento e lasciare che un'altra classe (classe di visualizzazione) ottenga quella variabile. Ma come farà la classe a sapere quando la lista viene aggiornata e deve aggiornare la visualizzazione?

Questa è solo la strategia che stavo pensando. Forse ci sono modi migliori ...

+0

Non so se lo avete preso in considerazione, ma ho solo una parola in testa: Multithreading. Un thread di algoritmo e un thread di visualizzazione? –

+0

Avrò sicuramente bisogno di più thread.Il problema principale è: in che modo il thread di visualizzazione sa che deve essere aggiornato? – aerod

+0

Disegna una foto. (Visualizzalo. Non modifica il codice.) –

risposta

0
  1. Avere classe (es) che rappresentano cerchio (e qualsiasi altro oggetto presente in questo problema/algoritmo) e contengono i metodi per ogni operazione.
  2. Implementare l'algoritmo come operazione sugli oggetti da (1) - come chiamate ai metodi.
  3. Creare una classe di visualizzazione che esamini gli oggetti da 1 e visualizzi il loro stato su ciascun metodo, ad esempio: Update().
  4. Creare sottoclassi di tutte le classi in (1) che, a parte il loro comportamento originale, che chiamano Visualization.Update() su ciascuna operazione.

Costruisci "il tuo mondo" fuori da (4) classi invece di (1) per avere una visualizzazione.

1

Forse la lettura sul pattern Observer può aiutare: https://en.wikipedia.org/wiki/Observer_pattern

è possibile implementare java.util.Observer o dare l'algoritmo di una funzione di callback/oggetto.

È possibile consegnare i dati arbitrari dell'osservatore, in modo tale da consentire all'utente di decidere quando l'algoritmo esegue un controllo di sovrapposizione.

1

Non sono sicuro che questo ti sia d'aiuto o meno, ma se non puoi modificare il codice dell'algoritmo per supportare gli osservatori, allora un'opzione (interessante) sarebbe quella di esaminare la programmazione orientata all'aspetto.

Ad esempio, in AspectJ (ad esempio vedere http://en.wikipedia.org/wiki/AspectJ) è possibile specificare (usando le cose chiamate 'pointcuts') posti (chiamati 'join points') dove devono essere eseguiti bit di codice aggiuntivo (chiamato 'advice'). Si può usare questo per rilevare i controlli di sovrapposizione eseguiti dall'algoritmo e rispondere a loro come meglio credi.

Ovviamente, fare le cose in questo modo implicherebbe l'uso di AspectJ, quindi non sarebbe possibile con il normale Java - ma è qualcosa di interessante che potresti voler esaminare.