Question

Dans un outil tel que Photoshop, vous pouvez cliquer sur une sélection d’outils (par exemple un stylo, un pinceau, etc.). Une fois que vous avez cliqué sur un outil, vous pouvez l’utiliser pour peindre, effacer, etc. en fonction de l’outil sélectionné.

Je me demande comment cela pourrait être mieux implémenté dans une conception orientée objet. Je ne pouvais penser qu'à un GUIManager qui sache toujours quel outil est sélectionné. Lorsque le canevas (zone de dessin) détecte un clic ou un glissement de souris, il demande à GUIManager quel outil est sélectionné et applique le comportement de cet outil.

Quelqu'un décrit-il une solution possible en détail au niveau de la classe (ou en détail si vous n'avez pas le temps)?

Était-ce utile?

La solution

Consultez le Modèle d'état qui contient exactement votre exemple.

Cependant, ce n'est pas réellement une question d'interface graphique, mais plutôt une approche orientée objet pour modéliser ce problème. L’interface graphique n’intervient pas vraiment dans ce domaine.

Autres conseils

Je ne suis pas sûr que les principes OO jouent vraiment dans ce sens, sauf que tous les éléments graphiques sont probablement dérivés des classes de base communes de l'interface graphique de votre choix.

La complexité d'une application nécessitant une hiérarchie de menus d'écran & # 224; la photoshop réduirait sans doute la différence entre composition vs héritage vs style fonctionnel vs tout ce que vous voulez.

Bien que, si vous êtes motivé pour écrire le programme deux fois en utilisant des styles différents, il peut être intéressant de voir les résultats. Le classement des différents styles de programmation est une question ouverte sans réelle réponse à ce stade, même si nous pensons que les styles orientés objet sont importants, ce que nous n’avons pas encore complètement quantifiés.

Une idée serait de créer une classe d’outils. Il suffit de dessiner cela en C ++, comme un pseudocode:

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
};

Vous héritez ensuite de cette classe d'outils abstraite pour fournir les outils concrets dont votre application a besoin. Lorsqu'un certain outil est sélectionné, vous instanciez un objet d'outil correspondant et vous vous en souvenez quelque part. La fenêtre transmet les événements de la souris à l’objet outil actuellement actif, qui fait ensuite l’opération appropriée pour l’outil sélectionné.

C’est une implémentation du modèle d’État auquel Johannes fait référence.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top