8
votes

Modèle de conception d'observateur - sujets concrets et observateurs

Les références (modèles de conception GOF, principaux motifs de conception de la tête, http: //www.dofactory. com / motifs / modrobserver.aspx ) que j'ai lu concernant le motif de conception observateur stipule que le sujet concret tient une référence à l'observateur concret. Beaucoup comme celui-ci:

class ConcreteObserver : IObserver
{
    ISubject concreteSubjectInstance;
    //other code, etc.
} 


0 commentaires

5 Réponses :


2
votes

juste parce que la définition que vous lisez les états Le sujet contient une référence à l'observateur concret ne signifie pas que vous devez le lire littéralement.

Tant que le sujet a une référence / un lien vers l'observateur, que ce soit concret ou via une interface / classe, la déclaration reste vraie.

Son très courant de voir une interface sur iobserver latéral et iobservable. Je pense que la question que vous allez trouver est que lorsque vous faites du sujet abstrait, vous devez vraiment essayer d'essayer durement et de trouver comment pour rendre votre état générique.


0 commentaires

6
votes

de votre image, votre méthode "Mettre à jour ()" ne reçoit aucune information à propos de l'état du sujet, de sorte que l'observateur a besoin d'informations sur cet état (comme d'habitude dans le modèle d'observateur ), alors il doit le récupérer de la méthode concretesubject à la méthode "GetState ()" (non présente dans Isubject).

Une alternative à ce schéma serait de transmettre l'état (ou une référence à la bétonneuse complète) en tant que paramètre de «mise à jour ()».

Autres explications générales à Avoir une référence à Concrétésubject au lieu d'Isubject peut être que vous voudrez peut-être interagir avec le concretSubject pour invoquer la logique commerciale (bien sûr non exposée dans l'interface ISubject).


2 commentaires

«Passer comme paramètre à la méthode de mise à jour»: Je suppose que cela pourrait également être comme un paramètre sur le constructeur d'observateur.


Oui, pour définir la référence interne, elle devrait être effectuée dans le constructeur. Mais si vous ne conservez pas une référence interne, vous pouvez toujours recevoir dans chaque invocation de «mise à jour ()». C'est la façon dont la mise en œuvre de modèle d'observateur intégrée Java est intégrée.



1
votes

Observateur de béton et la mise en œuvre du sujet concrète ont également un état. Lorsque l'état de sujet est des changements, l'état d'observateur concret est également mis à jour. Mais parfois, vous pourriez avoir besoin de voir l'état de sujet que vous n'avez pas, pour cela, vous feriez mieux de faire référence à la matière. En d'autres termes, afin de voir l'état de sujet concret.


0 commentaires

1
votes

Je vais essayer de fournir mon point de vue.

Pourquoi le béton? Ne causeront-ils pas de couplage entre sujet et observateur?

  • La principale préoccupation du modèle d'observateur est de 1 à n modèle, pas de N-to-N, et celle-ci est réalisée par l'interface d'observateur.

  • Oui, il provoque un couplage et il est destiné, chaque observateur de béton obtiendra donc exactement ce qu'il veut, sans "contexte de passage" redondant ".

    Le couplage est mauvais, mais principe> découplage.

    Si un sujet concret est accessible via l'interface de sujet, nous pouvons vous abonner à différents sujets au moment de l'exécution! Droite?

    • Non, pour chaque Mise à jour () , il ne devrait faire que une chose . principe de responsabilité unique .
    • Et si on veut écouter plusieurs événements ? Cela peut être fait par composition , pas si de regrouper toutes les choses dans un seul mise à jour () .

      Certains livres / ressources en ligne auteurs font update () dans quelque chose comme update (sujet, contexte, varname, ...) alors ils supposent ce que l'observateur aurait besoin, mais

      Quel obtient un observateur n'aura pas besoin de ce sujet, pourquoi ne pas le prendre vous-même?

      Couplage ConcretObServer sur Concrétésubjecte de sorte que le travail du sujet consiste simplement à envoyer une notification, pas les données.

      Sujet: Hé tout le monde, mon magasin est ouvert!
      Obsérant: OK, je pense avoir besoin de cet iPhone.
      Observateur: OK, je pense avoir besoin de cet ordinateur Windows.
      Observateur: J'aime l'ordinateur iPhone et Windows, je devrais peut-être demander à A, B pour les nouvelles.


0 commentaires

0
votes

D'accord avec @Rainning, les observateurs concrets peuvent avoir intérêt à différents domaines d'observabilité. L'observateur peut obtenir ce qu'il veut dans sa propre méthode de mise à jour. Voici un exemple pour mes études «Head premier modèle de conception» avec C ++:

https://github.com / Jwbecalm / Head-First-Design-Modèles-in-CPP / Tree / Main / CH02_OBSERVER

Inclure également la classe Plantuml


0 commentaires