Skip to content

20240122: Strategy: Composición en vez de Herencia

  • Cuando se aplica herencia, las cosas en la clase padre afectan a todos los hijos.
    • Si se agrega algo en el padre, aquellos que no lo requieran deben sobrescribirlo.
    • La herencia facilita el uso de lo común en un único contexto pero dificulta el uso de lo común en otros contextos
Duck
+String type
+String name
+quack()
+swim()
+fly()
+display()
MallardDuck
RedheadDuck
RubberDuck
+quack()
+swim()
+fly()
DecoyDuck
+swim()
+fly()
y1q9qj
  • Cuando se desea que solamente algunas cosas sean heredados por algunos hijos

  • Con Herencia: Behavior en la implementación

    • lo que es no común se puede extraer interfaces
    • los hijos que implementen las interfaces tendrán lo no común
      • Cada uno necesitará implementar lo que no es común
«interface»
Quackable
+quack()
«interface»
Flyable
+fly()
Duck
+String type
+String name
+swim()
+display()
MallardDuck
+quack()
+fly()
RedheadDuck
+quack()
+fly()
RubberDuck
+quack()
DecoyDuck
2a86h9
  • Con Composición: Behavior en el tipo
    • lo que no es común se puede extraer a clases que implementen cierta interface
    • el padre usa el tipo
    • los hijos usan las implementaciones
is-a
is-a
is-a
is-a
is-a
has-a
has-a
«interface»
QuackBehavior
+quack()
Quack
+quack()
MuteQuack
+quack()
Squeak
+quack()
«abstract»
Duck
+String type
+String name
+QuackBehavior quackBehavior
+FlyBehavior flyBehavior
+performQuack()
+swim()
+performFly()
+display()
«interface»
FlyBehavior
+fly()
FlyWithWings
+fly()
FlyNoWay
+fly()
MallardDuck
+QuackBehavior quackBehavior = Quack
+FlyBehavior flyBehavior = FlyWithWings
RedheadDuck
+QuackBehavior quackBehavior = Quack
+FlyBehavior flyBehavior = FlyWithWings
RubberDuck
+QuackBehavior quackBehavior = Squeak
+FlyBehavior flyBehavior = FlyNoWay
DecoyDuck
+QuackBehavior quackBehavior = MuteQuack
+FlyBehavior flyBehavior = FlyNoWay
ho5r2