Rozróżnianie delegacji, kompozycji i agregacji (Java OO Design)

Stoję przed ciągłym problemem odróżniania delegacji, kompozycji i agregacji od siebie i identyfikowania przypadków, w których najlepiej jest użyć jednego nad drugim.

Konsultowałem się z książką do analizy i projektowania Java oo, ale moje zamieszanie nadal pozostaje. Główne Wyjaśnienie jest takie:

Delegacja : gdy mój obiekt używa funkcji innego obiektu tak jak jest, bez jej zmiany.

Skład : mój obiekt składa się z innych obiektów ktĂłre z kolei nie moĹĽna istnieÄ ‡ po zniszczeniu mojego obiektu-Ĺ " mieci.

Agregacja : mój obiekt składa się z innych obiektów, które mogą żyć nawet po zniszczeniu mojego obiektu.

Czy można mieć kilka prostych przykładów pokazujących każdy przypadek i uzasadnienie za nimi? W jaki inny sposób można wykazać te przykłady inne niż mój obiekt po prostu mający odniesienie do innego obiektu (ów)?

Author: Hussein El Feky, 2009-09-06

4 answers

Twój obiekt będzie odwoływał się do innego obiektu(ów) we wszystkich trzech przypadkach. Różnica polega na zachowaniu i / lub cyklu życia obiektów odniesienia. Niektóre przykłady:

  1. Skład: Dom zawiera jeden lub więcej pokoi. Życie pokoju jest kontrolowane przez Dom, ponieważ pokój nie będzie istniał bez domu.

  2. Agregacja: Dom zabawek zbudowany z klocków. Można go zdemontować, ale bloki pozostaną.

  3. Delegacja: twój szef poprosił Cię o kawę, masz zamiast tego zrobił to stażysta. Delegacja nie jest rodzajem asocjacji (podobnie jak skład / agregacja). Dwa ostatnie były omawiane na Stack Overflow wiele razy

W komentarzu zadajesz pytanie, Czym różni się implementacja w każdym przypadku, zauważając, że we wszystkich przypadkach wywołujemy metody na releated objects. To prawda, że w każdym przypadku mamy Kod taki jak

myRoom.doWork();

myBlock.doWork();

myMinion.doWork();

Ale różnice tkwią w cyklu życiowym i powiązane obiekty.

Dla komponentu, pokoje powstają, gdy dom jest tworzony. Więc możemy stworzyć je w budownictwie domu.

W przypadku Asocjacji (użyję Opony i samochodu) samochody mogą dodać opony do swojego konstruktora, ale później możesz chcieć wymontować i zmienić opony. Więc masz również metody takie jak

 removeTyre(FrontLeft)
 addNewTyre(aTyre, BackRight)

I jest całkiem prawdopodobne, że obiekt aTyre pochodził z fabryki-nie zrobiliśmy tego w żadnej z metod samochodu.

In w przypadku delegowania możesz nawet nie mieć zmiennej member do przechowywania delegata

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

Relacja między przedmiotami trwa tylko tak długo, jak stażysta przynosi kawę. Następnie wraca do puli zasobów.

 49
Author: ChssPly76,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:15

Delegacja

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

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

Gdy klienci A wywołują methodA, klasa A delegaci wezwanie do B ' s methodB.

uzasadnienie. Klasa A ujawnia zachowania, które należą do innych. Może się to zdarzyć w językach jednoklasowych, gdzie Klasa A dziedziczy z jednej klasy, ale jej klienci potrzebują zachowań zaimplementowanych w innej klasie. dalsze badania .

Delegacja Hybrydowa

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

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

Różnica między delegacją, która jest to metoda, która polega na prostym przekazywaniu i delegowaniu, która działa jako substytut dziedziczenia, polega na tym, że callee musi zaakceptować parametr wywołujący, czego przykładem jest:

    b.methodB( this );

uzasadnienie. pozwala instancjom klasy B korzystać z funkcjonalności dostępnej z klasy A, tak jak klasa B mogłaby dziedziczyć z klasy A--ale bez dziedziczenia. dalsze badania .

Skład

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

  public A() {
  }
}

Raz więcej odwołań do konkretnej instancji klasy A exist, jego instancja klasy B zostaje zniszczona.

uzasadnienie. pozwala klasom definiować zachowania i atrybuty w sposób modułowy. dalsze badania .

Agregacja

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

Gdy nie ma już odniesień do konkretnej instancji klasy A, jej instancja klasy B nie zostanie zniszczona. W tym przykładzie zarówno A, jak i C muszą być zbierane przed zniszczeniem B.

uzasadnienie. Pozwala instancjom Na ponowne użycie obiektów. dalsze badania .

Demonstracja Bez Odniesień

Nazwy nadane tym prostym wzorom są definiowane przez ich relacje odniesienia.

 51
Author: Dave Jarvis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-30 17:13:24

Twoja książka wyjaśnia całkiem dobrze, więc pozwól mi rozwinąć i podać kilka przykładów.

delegacja: gdy mój obiekt używa funkcji innego obiektu tak jak jest bez jej zmiany.

Czasami klasa może logicznie potrzebować być duża. Ale duża klasa nie jest dobrym kodowaniem pratice. Również czasami niektóre funkcjonalności klasy mogą być implementowalne w więcej niż jeden sposób i możesz chcieć to zmienić w pewnym czasie.


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
}

Z powyższego przykładu, Big.funkcja () wywołanie cecha FH jak jest bez zmiany go. W ten sposób Klasa Big nie musi zawierać implementacji funkcji (separacji pracy). Ponadto funkcja () może zaimplementować inaczej przez inne klasy, takie jak" NewFeatureHolder", a Big może wybrać użycie nowego posiadacza funkcji.

Skład: mój obiekt składa się z innych obiektów, które z kolei nie mogą istnieć po tym, jak mój obiekt zostanie zniszczony-śmieci zbierane.

agregacja: Mój obiekt składa się z innych obiekty, które mogą żyć nawet po zniszczeniu mojego obiektu.

Technicznie, kompozycja jest "częścią", a agregacja jest" odniesieniem do " relacji. Twoje ramiona są częścią ciebie. Jeśli już nie będziesz żył, twoja ręka też umrze. Twoje ubranie nie jest częścią ciebie, ale je masz; jak możesz gościć, twoje ubranie nie idzie z Tobą.

W programowaniu niektóre obiekty są częścią innego obiektu i bez niego nie mają logicznego znaczenia. Na przykład przycisk składa się z ramki okna. Jeśli a ramka jest zamknięta, przycisk nie ma powodu, aby być w pobliżu (kompozycja). Przycisk może mieć odniesienie do bazy danych (np. do odświeżania danych); gdy przycisk zostanie wyeliminowany, baza danych może nadal być w pobliżu (agregacja).

Sorry for my English, Hope this helps

 15
Author: NawaMan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-05 23:44:08

1) Delegacja: przykład człowiek-kierowca-samochód. Mężczyzna kupił samochód. Ale ten człowiek nie wie, jak prowadzić samochód. Więc wyznaczy kierowcę, który zna się na prowadzeniu samochodu. Więc Klasa Man chce wykonać transport za pomocą samochodu. Ale nie ma interakcji - funkcjonalność / kompatybilność z samochodem. Więc używa klasy, która ma kompatybilność z samochodem, który jest kierowcą, który jest kompatybilny z klasą man. Zakładając, że kierowca może zrozumieć, co mówi człowiek

2) Skład: symulacja samochodu to rutynowy przykład. Aby poruszać się samochodem, koła obracają się. Klasa samochodu wykorzystująca funkcję obracania koła w ramach funkcji ruchu, gdzie jako koło jest częścią samochodu.

3) agregacja: samochód i jego kolor. Obiekt klasy samochodu ferrari będzie miał obiekt klasy koloru czerwonego. Ale obiekt klasy kolorów red może być tam jako klasa indywidualna, gdy wyszukiwanie użytkownika odbywa się ze specyfikacją koloru czerwonego.

 1
Author: Vishwamithra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-24 13:16:36