Ceci est un ancien article, mais je vais quand même carillon car les autres réponses ne traitent pas de ce qui se passe lors de l'utilisation de l'un ou l'autre modèle, elles semblent être plus sur la théorie que sur la pratique.
Fonctionnement de la délégation et de l'observateur
Avec Délégation, le délégant choisit exactement qui va répondre à un événement particulier au moment où la source de l'événement potentiel est créée. Vous pourriez considérer cet auditeur comme un seul observateur . Dans le cas du modèle Observateur, l'observateur choisit qui il observe chaque fois qu'il en a envie; de sorte que les dépendances sont inversées en ce qui concerne l'observateur par rapport à la délégation. Avec le modèle des observateurs, pensez à un journal et aux abonnés comme des observateurs. Les observateurs contrôlent le moment où la relation est créée. Avec délégation, pensez à un employé et à un employeur. L'employeur contrôle le moment où la relation est créée et exactement qui est en charge d'événements spécifiques. Les employés ne peuvent pas choisir les tâches sur lesquelles ils travaillent ... en général.
Certains soutiennent que la délégation peut avoir un observateur mais je pense que la vraie différence entre les deux est la façon dont la gestion des événements est affectée. Vous ne verrez jamais un délégué s'inscrire à un événement. Il ne saura jamais sa gestion de l'événement jusqu'à ce qu'il se produise et le délégant appelle une méthode publique à ce sujet.
Avantage de la délégation
Ce modèle est très rigide et avec la plupart des conceptions regid, il est plus simple et généralement plus robuste. Il vous oblige à déclarer votre gestionnaire d'événements à l'avance au moment de l'initialisation de la source de l'événement potentiel. Si vous avez besoin de quelqu'un pour diriger la circulation, affectez un directeur de la circulation avant d'ouvrir la rue. Dans le cas de l'observateur, vous laisseriez le policier chargé du trafic choisir le moment de diriger le trafic chaque fois qu'il en aurait envie.
Inconvénient de la délégation
L'inconvénient de cette conception est qu'elle n'est pas flexible. Si vous implémentez un code pour vous abonner à un journal, le journal / le délégué devra identifier exactement qui peut lire les articles dès leur création. Avec le modèle d'observateur, ils peuvent être enregistrés plus tard à tout moment et le journal n'aura qu'à savoir qu'une nouvelle personne s'est inscrite.
Quand choisir la délégation?
Lorsque vous avez besoin d'un ou de plusieurs observateurs spécifiques et que vous n'avez aucune raison de changer qui observe, la conception rigide du modèle de délégation sera bénéfique.
Par exemple, vous avez besoin d'une classe / d'un objet pour gérer la création d'une fenêtre contextuelle pour une erreur spécifique. Il n'y a pas beaucoup de raisons pour lesquelles au moment de l'exécution, vous devrez changer la personne qui gère une erreur spécifique, il serait donc judicieux de déléguer l'erreur «Mémoire insuffisante» à une seule entité. La création d'un tableau de gestionnaires potentiels, puis leur enregistrement pour l'erreur "Mémoire insuffisante" n'aurait pas beaucoup de sens; ce serait un exemple d'utilisation du modèle d'observateur dans cette situation. Au moment de l'exécution, vous souhaiterez peut-être modifier les méthodes appelées ou le «délégué» appelé pour les événements variables, mais il n'est pas normal de remplacer un gestionnaire d'événements par un événement spécifique au moment de l'exécution.
Il n'est pas impossible d'échanger des délégués comme vous le feriez dans le modèle d'observateur, c'est juste compliqué. Dans le monde réel, vous pouvez peut-être échanger des agents de la circulation afin qu'un nouveau délégué gère le trafic. On pourrait dire qu'une meilleure conception ferait du délégué d'origine un poste de police et non un seul officier de police, mais je m'éloigne du sujet ...