63 votes

faire la distinction entre la délégation, la composition et l'agrégation (conception Java OO)

Je suis confronté à un problème persistant de distinguer la délégation, à la composition et agrégation les uns des autres, et les cas où son mieux pour utiliser l'un sur l'autre.

J'ai consulté un java OO analyse et de la conception de l'ouvrage, mais ma confusion demeure. La principale explication est ceci:

délégation: Quand mon objet en utilise un autre objet de la fonctionnalité est sans la modifier.

composition: Mon objet se compose d'autres objets qui ne peuvent pas exister après mon objet est détruit, des déchets collectés.

agrégation: Mon objet se compose d'autres objets qui peuvent vivre même après mon objet est détruit.

Est-il possible d'avoir quelques exemples illustrant chaque cas, et le raisonnement derrière eux? Sinon, comment ces exemples ont démontré d'autre que mon objet simplement une référence à un autre objet(s)??

Merci beaucoup à l'avance.

71voto

Dave Jarvis Points 12598

Délégation

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

  public void methodA() {
    b.methodB();
  }
}

Lorsque les clients de l' A appel methodA, classe A des délégués de l'appel à Bs' methodB.

Raison d'être. Classe A expose les comportements qui lui appartiennent d'ailleurs. Cela peut se produire dans un seul héritage langues où Une classe hérite d'une classe, mais de ses clients ont besoin des comportements qui sont mis en œuvre dans une classe différente. Poursuite de l'étude.

Composition

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

  public A() {
  }
}

Une fois pas plus de références à une instance particulière de la classe A existent, à une instance de la classe B est détruit.

Raison d'être. Permet à des classes pour définir les comportements et les attributs de façon modulaire. Poursuite de l'étude.

L'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 );
  }
}

Lorsqu'il n'y a plus de références à une instance particulière de la classe A, son instance de la classe B ne sera pas détruit. Dans cet exemple, les deux A et C doit être nettoyée avant d' B sera détruit.

Raison d'être. Permet des instances de la réutilisation d'objets. Poursuite de l'étude.

Démonstration Sans Références

Les noms donnés à ces motifs simples sont définis par leur référentiel des relations.

57voto

ChssPly76 Points 53452

Votre objet fasse référence à un autre objet(s) dans les trois cas. La différence réside dans le comportement et / ou du cycle de vie des objets référencés. Quelques exemples:

  1. Composition: Maison contient une ou plusieurs chambres. La salle de la durée de vie est contrôlée par la Chambre comme la Salle ne sera pas exister sans la Maison.

  2. Agrégation: Jouet maison construite à partir de blocs. Vous pouvez le démonter, mais bloque restera.

  3. Délégation: Votre patron vous a demandé de lui trouver un café, vous avez eu un stagiaire de le faire pour vous à la place. La délégation n'est pas un type d'association (comme de la composition / agrégation sont). Les deux derniers ont été évoquées dans le Débordement de la Pile plusieurs fois

Dans le commentaire vous demandez comment la mise en œuvre diffèrent dans chaque cas, en observant que, dans tous les cas, nous appeler des méthodes sur le releated objets. Il est vrai que, dans chaque cas, il s'agirait d'un code tel que

myRoom.doWork();

myBlock.doWork();

myMinion.doWork();

mais les différences se situent dans le cycle de la vie et de la cardinalité des objets connexes.

Pour le Composant, les Chambres sont à l'existence lorsque la Maison est créé. Donc, nous pourrions créer dans le constructeur de la Maison.

Dans le cas de l'Association (je vais utiliser des Pneus et la Voiture), les Voitures peut ajouter des Pneus dans leur constructeur, mais plus tard, vous souhaiterez peut-être supprimer et changer de pneus. Si vous avez également des méthodes telles que

 removeTyre(FrontLeft)
 addNewTyre(aTyre, BackRight)

Et il est fort probable que l'aTyre objet venu de l'Usine, nous n'avons pas new en tout de la Voiture de l'méthodes.

Dans le cas de la Délégation, vous pourriez même ne pas avoir un membre de la variable pour contenir le délégué

 resourcingPool().getIntern().getCoffee(SkinnyLatte, workstation 7);

la relation entre les objets ne dure que tant que le stagiaire est l'extraction du café. Puis il revient sur le pool de ressources.

17voto

NawaMan Points 615

Votre livre explique très bonne, donc permettez-moi d'élaborer et de fournir quelques exemples.

délégation: Quand mon objet en utilise un autre objet de la fonctionnalité est sans la modifier.

Parfois, une classe peut logiquement besoin d'être grand. Mais de grande classe n'est pas une bonne pratique de codage. Aussi, parfois, certaines fonctionnalités d'une classe peuvent être mises en œuvre dans plus d'une façon et que vous souhaitez modifier un certain temps.


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
}

À partir de l'exemple ci-dessus, Big.fonction() appel de fonction de FH comme il est sans le modifier. De cette façon, la Grande classe n'a pas besoin de contenir de la mise en œuvre de la fonctionnalité (séparation du travail). Aussi, la fonction de() peut mettre en œuvre différemment par d'autres classe comme "NewFeatureHolder" et Grands peuvent choisir d'utiliser la nouvelle fonctionnalité de titulaire à la place.

composition: Mon objet se compose d'autres objets qui ne peuvent pas exister après mon objet est destryed-ordures.

agrégation: Mon objet se compose d'autres objets qui peuvent vivre même après mon objet est détruit.

Technially, la Composition est "partie" de l'Agrégation et de l'est "voir" de la relation. Vos bras sont partie de vous. Si vous ne vivez plus, votre bras va mourir aussi. Votre linge n'est pas une partie de vous, mais vous les avez; comme vous pouvez l'invité, votre linge ne va pas avec vous.

Dans la programmation, certains objets font partie d'un autre objet, et ils n'ont pas de logique, de sens sans elle. Par exemple, un bouton est composé dans un cadre de fenêtre. Si un cadre est fermé, le bouton n'a pas de raison d'être autour de plus (Composition). Un bouton peut faire référence à une base de données (comme pour refreash de données); lorsque le bouton est éliminé, la base de données peut encore être de l'ordre (Agrégation).

Désolé pour mon anglais, Espérons que cette aide

1voto

sharath Points 8

1) la Délégation: l'Homme de pilote de voiture par exemple. Un Homme a acheté une voiture. Mais que l'homme ne sait pas conduire la voiture. Donc, il va nommer un pilote qui sait conduire une voiture. Donc, l'Homme de la classe souhaite effectuer un transport d'utilisation de la voiture. Mais il n'a pas l'interaction de fonctionnalités/la compatibilité avec la voiture. Il utilise une classe qui a de la compatibilité avec la voiture qui est le pilote qui est compatible avec l'homme de la classe. En supposant que le conducteur peut comprendre ce que l'homme dit

2) Composition: Voiture simulation est un exemple de routine. La voiture se déplace, la roue tourne. Voiture de classe à l'aide de la roue de la classe tourner functinality dans le cadre de sa fonction de déplacement, où que la roue est partie de la voiture.

3) Agrégation: Voiture et sa couleur. La voiture de classe de l'objet ferrari aura une couleur classe de l'objet rouge. Mais la couleur de la classe de l'objet rouge peut être là en tant que personne de la classe, lors de la recherche pour l'utilisateur qui se passe avec une spécification de couleur rouge.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X