Pregunta

En una herramienta como Photoshop, hay una selección de herramientas en las que puede hacer clic (por ejemplo, lápiz, pincel, etc.). Una vez que haga clic en una herramienta, puede usarla para pintar, borrar, etc., según la herramienta seleccionada.

Me pregunto cómo se implementaría mejor en un diseño OO. Solo podría pensar en tener un GUIManager que siempre sepa qué herramienta está seleccionada, luego, cuando el Lienzo (área de dibujo) detecta un clic del mouse o arrastra el mouse, le pregunta a GUIManager qué herramienta está seleccionada y aplica su comportamiento.

¿Alguien describe una posible solución en los detalles de nivel de clase (o en cualquier detalle si no tienes tiempo)?

¿Fue útil?

Solución

Echa un vistazo a la Patrón de estado que tiene exactamente tu ejemplo.

Sin embargo, en realidad no es una pregunta de la GUI, sino más bien un enfoque orientado a objetos sobre cómo modelar este problema. La GUI no juega realmente en esto.

Otros consejos

No estoy seguro de que los principios de OO jueguen realmente en esto, excepto en el sentido de que todos los elementos gráficos probablemente se derivan de las clases base comunes en la GUI de su elección.

La cantidad de complejidad en una aplicación que necesita una jerarquía de menús de pantalla a la vez en photoshop supuestamente reducirá la diferencia entre la composición frente a la herencia frente al estilo funcional frente a lo que quieras.

Aunque, si te motiva escribir el programa dos veces con diferentes estilos, puede ser interesante ver los resultados. La clasificación de varios estilos de programación es una pregunta abierta sin respuestas reales en este momento, aunque creemos que los estilos OO son importantes de una manera que aún no hemos cuantificado completamente.

Una idea para esto sería tener una clase de herramienta. Solo esbozando esto en C ++ - como pseudocódigo:

class Tool
{
public:
    // Keep a pointer to the "document", i.e. some representation of the
    // image you are editing
    Tool(Document *pDoc);

    // Process mouse events -- this need to be overridden to execute
    // the appropriate behaviour depending on the concrete type of tool
    virtual void OnMouseEvent(const MouseEvent &e) = 0;

    // and so on
};

Luego hereda de esta clase de herramienta abstracta para proporcionar las herramientas concretas que necesita su aplicación. Cuando se selecciona una determinada herramienta, crea una instancia de un objeto de herramienta correspondiente y lo recuerda en algún lugar. La ventana reenvía los eventos del mouse al objeto de la herramienta actualmente activa, que luego hace lo correcto para la herramienta que se seleccionó.

Esta es una implementación del patrón de estado al que se refiere Johannes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top