Distinction entre délégation, composition et agrégation (Java OO Design)

Je suis confronté à un problème permanent en distinguant la délégation, la composition et l’agrégation, et en identifiant les cas où il est préférable de les utiliser les uns sur les autres.

J’ai consulté un livre d’parsing et de conception Java OO, mais ma confusion demeure. La principale explication est la suivante:

Délégation : lorsque mon object utilise les fonctionnalités d’un autre object telles quelles sans les modifier.

Composition : Mon object est constitué d’autres objects qui, à leur tour, ne peuvent pas exister après que mon object a été détruit, les déchets récupérés.

Agrégation : Mon object est constitué d’autres objects pouvant vivre même après la destruction de mon object.

Est-il possible d’avoir quelques exemples simples démontrant chaque cas et le raisonnement derrière eux? Comment sinon ces exemples peuvent-ils être démontrés autres que mon object ayant simplement une référence à un autre object?

Délégation

 public class A { private B b = new B(); public void methodA() { b.methodB(); } } 

Lorsque les clients de la methodA A appellent, la classe A délègue l’appel à la methodB B de methodB

Raisonnement. La classe A expose les comportements qui appartiennent ailleurs. Cela peut se produire dans les langages à un seul inheritance où la classe A hérite d’une classe, mais ses clients ont besoin de comportements implémentés dans une classe différente. Etude approfondie

Délégation hybride

 public class A { private B b = new B(); public void methodA() { b.methodB( this ); } } 

La différence entre la délégation qui implique une simple transmission et la délégation qui remplace l’inheritance est que l’appelé doit accepter un paramètre de l’appelant, comme par exemple:

  b.methodB( this ); 

Raisonnement. Autorise les instances de classe B à utiliser les fonctionnalités disponibles dans la classe A , tout comme la classe B ferait si elle héritait de la classe A mais sans inheritance. Etude approfondie

Composition

 public class A { private B b = new B(); public A() { } } 

Lorsque plus aucune référence à une instance particulière de la classe A n’existe, son instance de classe B est détruite.

Raisonnement. Permet aux classes de définir les comportements et les atsortingbuts de manière modulaire. Etude approfondie

Agrégation

 public class A { private B b; public A( B b ) { this.b = b; } } public class C { private B b = new B(); public C() { A a = new A( this.b ); } } 

Une fois qu’il n’y a plus de références à une instance particulière de la classe A , son instance de classe B ne sera pas détruite. Dans cet exemple, A et C doivent tous deux être nettoyés avant que B soit détruit.

Raisonnement. Permet aux instances de réutiliser des objects. Etude approfondie

Démonstration Sans Références

Les noms donnés à ces modèles simples sont définis par leurs relations référentielles.

Votre livre explique très bien, alors laissez-moi vous donner quelques exemples.

délégation: lorsque mon object utilise les fonctionnalités d’un autre object tel quel sans le modifier.

Parfois, une classe peut logiquement avoir besoin d’être grande. Mais la grande classe n’est pas une bonne pratique de codage. De plus, certaines fonctionnalités d’une classe peuvent être implémentées de plusieurs manières et vous voudrez peut-être les modifier plus tard.

 class FeatureHolder { void feature() { // Big implementation of the feature that you dont want to put in the class Big } } class Big { private FeatureHolder FH = new FeatureHolder(); void feature() { // Delegate to FeatureHolder. FH.feature(); } //.. Other features } 

Dans l’exemple ci-dessus, Big.feature () appelle la fonctionnalité de FH telle quelle sans la modifier. De cette façon, la classe Big n’a pas besoin de contenir l’implémentation de la fonctionnalité (séparation du travail). En outre, feature () peut implémenter différemment les autres classes telles que “NewFeatureHolder” et Big peut choisir d’utiliser plutôt le nouveau détenteur de fonctionnalité.

composition: Mon object est constitué d’autres objects qui, à leur tour, ne peuvent pas exister après que mon object a été détruit.

agrégation: Mon object est constitué d’autres objects pouvant vivre même après la destruction de mon object.

Techniquement, la composition est “une partie de” et l’agrégation est une “référence à” la relation. Vos arm font partie de vous. Si vous ne vivez plus, votre arm mourra aussi. Votre linge ne fait pas partie de vous mais vous les avez; comme vous pouvez le faire, votre linge ne vous accompagne pas.

En programmation, certains objects font partie d’un autre object et ils n’ont aucune signification logique sans lui. Par exemple, un bouton est composé dans un cadre de fenêtre. Si un cadre est fermé, le bouton n’a plus de raison d’être (Composition). Un bouton peut faire référence à une firebase database (comme pour recréer des données); lorsque le bouton est éliminé, la firebase database peut toujours être présente (Agrégation).

Désolé pour mon anglais, j’espère que ça aide

1) Délégation: exemple homme-pilote-voiture. Un homme a acheté une voiture. Mais cet homme ne sait pas conduire la voiture. Il désignera donc un chauffeur qui sait conduire une voiture. La classe Man veut donc effectuer un transport en voiture. Mais il n’a pas de fonctionnalité / compatibilité avec la voiture. Il utilise donc une classe compatible avec car driver qui est compatible avec la classe man. En supposant que le conducteur puisse comprendre ce que l’homme dit

2) Composition: La simulation de voiture est un exemple de routine. Pour faire bouger une voiture, la roue tourne. La classe de voiture utilisant la classe de roue fait tourner la fonctionnalité dans le cadre de sa fonction de déplacement, où la roue fait partie de la voiture.

3) Agrégation: voiture et sa couleur. Un object de classe de voiture ferrari aura un object de classe de couleur rouge. Mais l’object de classe de couleur rouge peut être présent en tant que classe individuelle, lorsque la recherche de l’utilisateur se produit avec une spécification de couleur rouge.