Salut,
Je cherche des design patterns pour le cas d'utilisation suivant, s'inscrivant dans le thème "gestion de rôles-utilisateur" :
Chaque utilisateur de l'application peut endosser dynamiquement (à l'exécution) différents rôles. Ces rôles peuvent définir différemment une même fonctionnalité, étendre une même fonctionnalité, mais également adjoindre des fonctionnalités qui leur sont propres. En parrallèle, une gestion des rôles doit déterminer les incompatibilités potentielles lors de l'ajout/suppression d'un rôle (contraintes et dépendances).
Dans un exemple pris au hasard, l'utilisateur a le rôle de "membre d'association", puis a le rôle de "trésorier d'association", puis le rôle de "fournisseur de l'association". L'ajout et la suppression de ces rôles peut se faire dans n'importe quel ordre, sous couvert d'un gestionnaire de rôles (a-priori).
Ici, la méthode permettant d'accéder au dossier d'un membre de l'association ne sera pas formée de la même manière d'une séquence de rôles à l'autre :
- ajout du rôle membre, puis du rôle trésorier : la méthode du rôle trésorier viendra compléter la méthode existante du rôle membre, pour permettre d'accéder à plus de détail. La méthode de dessin de l'IHM sera complétée pour faire apparaître des onglets de gestion supplémentaires.
- ajout du rôle trésorier seul : la méthode du rôle trésorier doit offrir les mêmes fonctionnalités que précedemment, mais la complétion d'une méthode préexistante n'est plus possible ici.
Le design pattern qui se rapproche le plus de ceci est le DP Décorateur, mais il contraint l'ordre/la séquence dans lequel les objets sont enveloppés/désenveloppés, alors que dans le cas ci-dessus, cet ordre doit être libre.
De plus, le DP décorateur est davantage basé sur l'héritage que sur la composition : l'objet A enveloppe l'objet B pour lui adjoindre des fonctionnalités. Ici, je recherche à la fois héritage et composition : un utilisateur est composé de différents rôles, même si certains rôles sont hérités les uns des autres.
Voilà voilà, gros programe ^^ .
Quel modèle de classes puis-je adopter pour réaliser cela ?
Merci.
Partager