0

J'apprenais des modèles de conception pour l'implémenter dans le code et je pense que j'ai trouvé un qui fonctionnera mais avec un défaut majeur.Avoir une demande traitée par plusieurs gestionnaires dans un modèle de chaîne de responsabilité

Le motif sur lequel j'ai fini est Modèle de chaîne de responsabilité. D'après ce que je comprends, il y a une demande transmise à un seul gestionnaire qui traitera la demande ou la transmettra dans la chaîne.

La seule capture que je vois est elle spécifie qu'une fois que l'un des gestionnaires traite la demande le traitement s'arrête. Je veux quelque chose qui va continuer dans la chaîne et donner la chance à chaque gestionnaire de traiter la demande.

Déclaration de problème

Je crée une application qui envoie une facture à une entreprise et je veux savoir qui tous ont regardé la facture et signé off.We doivent assurer que chaque ministère a signé comme les comptes, la finance, etc .. L'aspect important est juste cause 1 département signature il ne devrait pas mettre fin au processus que je crois arrive dans ce modèle

Il est tout à fait possible que ce modèle pourrait ne pas me convenir, si cela est possible S'il vous plaît me suggérer un modèle qui le ferait. Ce n'est pas un projet de classe, c'est juste que j'apprends à utiliser des motifs et à trouver son utilisation dans la vie quotidienne.

Répondre

1

Je ne sais pas si d'en faire une réponse ou un commentaire, mais:

Pour moi, il semble que vous êtes à la recherche d'un pipeline ou la piscine moreso qu'une chaîne de responsabilité. Dans une chaîne, l'idée directrice est que chaque maillon de la chaîne traitera les données ou les transmettra au lien suivant. Ensuite, une fois qu'un lien dans la chaîne traite les données, la fin de la chaîne.

Dans un pipeline, l'idée est que toutes les étapes examinent au moins les données, bien qu'elles ne puissent pas effectuer de traitement en fonction des données. Habituellement, la compréhension implicite est qu'un Pipeline est «linéaire-ish».

Dans votre cas, cela signifierait qu'un département doit approuver avant que le service suivant puisse le faire. Le pipeline implique également que l'état des données peut changer à mesure qu'il se déplace le long de celui-ci.

Comme dans votre exemple, il semble que l'approbation de chaque département soit indépendante, vous pouvez utiliser un pool. Normalement, nous considérons un pool comme un pool de threads, mais à sa base, un pool peut être considéré comme un groupe de processus indépendants qui s'appliquent aux mêmes données d'entrée, le résultat de chaque processus étant collecté et renvoyé sous une forme de collecte des résultats.

Bien sûr, il y a quelques considérations à prendre en compte: dès qu'un service refuse une demande, le système doit-il être court-circuité? Y a-t-il une logique commerciale compliquée en jeu, est-ce que quelque chose comme les ministères A et C approuvent, B refuse et le ministère D ne vote pas avant une échéance, un état théorique qui doit être traité?

Je l'ai tapé sur un téléphone avant de se coucher afin de pardonner toutes les lacunes dans la réponse. Je reviendrai demain pour y jeter un coup d'oeil et faire un peu de nettoyage si besoin est.

0

Le motif de stratégie est plus adapté à votre cas.

Vous devez décider de l'action suivante pour une facture.Ainsi, la facture en fonction de son état, peut être

  • payé
  • approuvé
  • en attente d'approbation
  • sous revue
  • projet

    etc.

Maintenant, chaque de ces états a un comportement logique et un état suivant. Vous pouvez avoir différents types de factures (sous-classe) qui reflètent le comportement de chacun de ces états.

Le super classe (interface/abstraite) pourrait avoir des méthodes telles que:

needsAction()  : boolean 
ownerDepartment() : Department // department it should go to next 

Ensuite, chaque sous-classes définiraient propre logique pour ces méthodes. Ceci évitera que votre modèle ne soit gonflé par un trop grand nombre d'if-elses pouvant prêter à confusion et pourrait être pire - changer de cas.