2010-07-27 4 views
1

Je veux mettre en œuvre le modèle d'observateur et je veux classe X pour observer les mises à jour dans les classes A et B.modèle d'observateur auprès de l'un observateur et de nombreux sujets

X est dérivé de la xobs de classe de base abstraite qui a la mise à jour () fonction prenant un enum comme paramètre de ce qui s'est passé.

Le problème logique ici est que X doit savoir lequel de A et B a envoyé la mise à jour et X ne peut pas le déterminer à partir du paramètre enum.

Quels sont les avantages/inconvénients d'ajouter un autre paramètre à update() qui indique lequel de A et B a envoyé la mise à jour? Quels autres moyens sont possibles pour résoudre cela? (Je préfère ne pas créer une classe de base A et B et envoyer un ce pointeur dans la mise à jour() A et B sont tout à fait différents.)

Merci,

Tomas

+0

Pourquoi n'utilisez-vous pas boost.signals? C'est un problème résolu –

+0

Je ne peux pas utiliser boost dans l'environnement dans lequel je travaille actuellement. Ce n'est pas mon choix. – Tomas

Répondre

1

La classe de base commune car a et b ne doivent pas avoir de fonctionnalité distincte - il suffit de l'utiliser pour exprimer le fait que A et B sont observables. En ce sens, A et B ne sont pas «tout à fait différents», ils sont identiques.

+0

Bon point, je suppose que vous voulez que je vous envoie un 'this' pointeur avec l'énumération dans la fonction de mise à jour alors? Ou est-ce que la classe de base Observable résout comment X peut séparer A et B d'une autre manière? – Tomas

+0

Généralement, la classe de base observable fournit également la fonctionnalité de notification, ainsi que le suivi de qui regarde. (Voir http://www.codeguru.com/cpp/tic/tic0290.shtml pour un aperçu), mais oui, si la gestion des notifications a été faite par une classe distincte, vous pouvez juste passer un pointeur dans la méthode de mise à jour pour indique l'objet qui a changé. – PaulJWilliams

+0

L'inconvénient de ceci est que vous avez besoin de downcast dans 'update()' pour déterminer la classe concrète de l'observable. Cela rend la mise en œuvre fragile et plus difficile à maintenir. –

0

Je vois les options suivantes:

  • rendre à la fois A et B mettre en œuvre une classe de base Observable commune (et les passer en tant que paramètres à update() - le problème, vous devez downcaster en update() pour détecter si le paramètre est de A ou B, ce qui rend la solution fragile
  • ajouter une sorte de paramètre de type drapeau update() - ce qui est assez similaire à la précédente, seulement moins orienté objet
  • créer des modèles à l'observateur/mise en œuvre observable - I havre de paix 't travaillé cela pleinement dans ma tête (un je n'ai pas d'IDE C++ pour le vérifier), mais je crois que de cette façon vous pouvez avoir deux surcharges de update() avec différents paramètres de type (A et B), donc la manipulation est séparée et directe, donc ce serait mon préféré option
Questions connexes