El paso a paso o código que encontrarás en este artículo es la resolución más sencilla y efectiva que encontramos a tus dudas o dilema.
Delegación
public class A
private B b = new B();
public void methodA()
b.methodB();
Cuando los clientes de A
llamar methodA
, clase A
delegados la llamada a B
‘s methodB
.
Razón fundamental. La clase A expone comportamientos que pertenecen a otra parte. Esto puede suceder en lenguajes de herencia única donde la clase A hereda de una clase, pero sus clientes necesitan comportamientos que se implementan en una clase diferente. Estudio adicional.
Delegación híbrida
public class A
private B b = new B();
public void methodA()
b.methodB( this );
La diferencia entre la delegación que implica el reenvío simple y la delegación que actúa como un sustituto de la herencia es que el destinatario de la llamada debe aceptar un parámetro del llamador, ejemplificado como:
b.methodB( this );
Razón fundamental. Permite clase B
instancias para usar la funcionalidad disponible de la clase A
, como clase B
lo haría si lo heredara de la clase A
–pero sin herencia. Estudio adicional.
Composición
public class A
private B b = new B();
public A()
Una vez que no hay más referencias a una instancia particular de clase. A
existe, su instancia de clase B
Esta destruido.
Razón fundamental. Permite a las clases definir comportamientos y attributes de forma modular. Estudio adicional.
Agregación
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 );
Una vez que no haya más referencias a una instancia particular de clase A
, su instancia de clase B
no será destruido. En este ejemplo, ambos A
y C
debe ser recolectada la basura antes B
será destruido.
Razón fundamental. Permite que las instancias reutilicen objetos. Estudio adicional.
Demostración sin referencias
Los nombres dados a estos patrones simples se definen por sus relaciones referenciales.
Su objeto haría referencia a otro (s) objeto (s) en los tres casos. La diferencia radica en el comportamiento y / o ciclo de vida de los objetos referenciados. Algunos ejemplos:
-
Composición: La casa contiene una o más habitaciones. House controla la vida útil de la habitación, ya que la habitación no existirá sin House.
-
Agregación: Casa de juguete construida a partir de bloques. Puedes desmontarlo pero quedarán bloques.
-
Delegación: Tu jefe te pidió que le trajeras un café, pero un pasante lo hizo por ti. La delegación no es un tipo de asociación (como lo son la composición / agregación). Los dos últimos se han discutido en Stack Overflow muchas veces
En el comentario preguntas cómo diferiría la implementación en cada caso, observando que en todos los casos invocamos métodos sobre los objetos releated. Es true que en cada caso tendríamos un código como
myRoom.doWork();
myBlock.doWork();
myMinion.doWork();
pero las diferencias radican en el ciclo de vida y la cardinalidad de los objetos relacionados.
Para el Componente, las Habitaciones nacen cuando se crea la Casa. Entonces podríamos crearlos en el constructor de la casa.
En el caso de Association (usaré Tire y Car), los automóviles pueden agregar Tires en su constructor, pero más adelante es posible que desee quitar y cambiar los neumáticos. Entonces también tienes métodos como
removeTyre(FrontLeft)
addNewTyre(aTyre, BackRight)
Y es muy probable que el objeto aTyre provenga de una Fábrica, no new
en cualquiera de los métodos del coche.
En el caso de Delegación, es posible que ni siquiera tenga una variable de miembro para contener al delegado
resourcingPool().getIntern().getCoffee(SkinnyLatte, workstation 7);
la relación entre los objetos dura sólo mientras el pasante vaya a buscar el café. Luego regresa al grupo de recursos.
Su libro explica bastante bien, así que permítame ampliarlo y brindarle algunos ejemplos.
delegación: Cuando mi objeto usa la funcionalidad de otro objeto tal cual sin cambiarlo.
En algún momento, una clase puede, lógicamente, tener que ser grande. Pero la clase grande no es una buena práctica de codificación. También en algún momento, algunas funcionalidades de una clase pueden implementarse en más de una forma y es posible que desee cambiar eso en algún momento.
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
En el ejemplo anterior, Big.feature () llama a la función de FH como está sin cambiarla. De esta manera, la clase Big no necesita contener la implementación de la característica (separación de mano de obra). Además, feature () se puede implementar de manera diferente por otra clase como “NewFeatureHolder” y Big puede optar por utilizar el nuevo titular de la característica en su lugar.
composición: Mi objeto consta de otros objetos que, a su vez, no pueden existir después de que mi objeto sea eliminado-recolectado.
agregación: Mi objeto consta de otros objetos que pueden vivir incluso después de que mi objeto sea destruido.
Técnicamente, la composición es “parte de” y la agregación es una relación de “referencia a”. Tus brazos son parte de ti. Si ya no vives, tu brazo también morirá. Tu ropa no es parte de ti, pero las tienes; como puedes huésped, tu ropa no va contigo.
En programación, algunos objetos son parte de otro objeto y no tienen un significado lógico sin él. Por ejemplo, un botón se compone de un marco de ventana. Si un marco está cerrado, el botón ya no tiene razón para estar presente (Composición). Un botón puede hacer referencia a una base de datos (como para actualizar datos); cuando se elimina el botón, es posible que la base de datos todavía esté disponible (agregación).
Lo siento por mi inglés, espero que esto ayude
Aquí tienes las comentarios y calificaciones
Agradecemos que desees sostener nuestro ensayo dejando un comentario o puntuándolo te damos las gracias.