2012-04-05 7 views
6

que quiere visualizar dos algoritmos diferentes que deciden si hay superposición en una colección de círculos en un plano en Java:¿Cómo visualizar un algoritmo sin cambiar el código de ese algoritmo?

  • un O (N ²) algoritmo que comprueba todas las combinaciones de círculos
  • un O (nlogn) algoritmo utilizando una línea de barrido

¿hay una manera de dejar un objeto de una clase vizualization 'escuchar' a un objeto de la clase algoritmo de manera que se pueda ver por ejemplo cuando el algoritmo está llevando a cabo una superposición comprobar entre un par de círculos y sabe cuándo actualizar la visualización?

otro ejemplo: Puedo mantener la lista de círculos activos (los que se cruzan con la línea de barrido) como una variable del algoritmo de barrido y dejar que otra clase (clase de visualización) obtenga esa variable. Pero, ¿cómo sabrá esa clase cuándo se actualiza la lista y tiene que actualizar la visualización?

Esa es la estrategia en la que estaba pensando. Tal vez hay mejores formas ...

+0

No sé si lo has considerado, pero solo tengo una palabra en mente: Multithreading. ¿Algún hilo de algoritmo y un hilo de visualización? –

+0

Definitivamente necesitaré varios hilos.El problema principal es: ¿cómo sabe el hilo de visualización que necesita actualizarse? – aerod

+0

Haz un dibujo. (Lo visualiza) No modifica el código. –

Respuesta

0
  1. Tienen las clases que representan el círculo (y cualquier otro objeto presente en este problema/algoritmo) y contienen los métodos para cada operación.
  2. Implementa algoritmo como la operación en los objetos de (1) - como llamadas a los métodos.
  3. Cree una clase de visualización que examine los objetos desde 1 y visualice su estado en cada uno, por ejemplo, Update() método.
  4. Crea subclases de todas las clases en (1) que, además de su comportamiento original, que llaman al Visualization.Update() en cada operación.

Construya "su mundo" entre (4) clases en lugar de (1) para tener una visualización.

1

Tal vez leer sobre el patrón observador puede ayudarle a: https://en.wikipedia.org/wiki/Observer_pattern

Usted puede aplicar java.util.Observer o dar el algoritmo de una función de devolución de llamada/objeto.

Puede entregar los datos arbitrarios del observador, lo suficiente como para permitirle decidir cuándo el algoritmo está realizando una verificación de superposición.

1

No estoy seguro de si esto te ayudará o no, pero si no puedes cambiar el código del algoritmo para admitir observadores, entonces una opción (interesante) sería buscar en la programación orientada a aspectos.

Por ejemplo, en AspectJ (por ejemplo, vea http://en.wikipedia.org/wiki/AspectJ) puede especificar (usando cosas llamadas 'pointcuts') lugares (llamados 'puntos de unión') donde se deben ejecutar bits de código adicional (llamado 'consejo'). Puede usar esto para detectar las comprobaciones de superposición que realiza el algoritmo y responderlas como mejor le parezca.

Por supuesto, hacer las cosas de esta manera implicaría el uso de AspectJ, por lo que no sería posible con solo Java normal, pero es algo interesante que podría interesarle.

Cuestiones relacionadas