name: title class: middle, center background-image: url(images/rawpixel/brooklyn-bridge.jpg) background-size: cover # .whiteinline[.fancy[[TE6] Patrones Estructurales]] ### .whiteinline[· Composite pattern] .whiteinline[Carlos Granell· Universitat Jaume I] .whiteinline[EI1039 - Diseño de Software · Sep 2023] ??? Brooklyn Bridge, New York City, United States. Original public domain image from Wikimedia Commons Image credits: [Rawpixel.com](https://www.rawpixel.com/image/3282163) --- class: inverse, center, middle background-image: url(images/DivingDesingPatterns10.png) background-size: contain ??? Image credits: [refactoring.guru](https://refactoring.guru/es/design-patterns/composite) --- class: inverse, center, middle # Composite Pattern .large[Propósito] .large[Problema] .large[Solución] .large[Estructura] .large[Aplicabilidad] --- name: purpose class: center, middle # Composite: Propósito ## compone objetos en estructuras anidadas (árbol) y los trata todos de forma .coldinline[uniforme] --- name: problem # Composite: Problema ### Tenemos estructuras complejas de objetos que _pueden_ modelarse en forma de árbol (menús de un restaurante, playlist de canciones, hilos de comentarios, etc.) ### Queremos aplicar las mismas operaciones sobre las composiciones de objetos y los objetos individuales ### Queremos obviar las diferencias entre objetos, tratarlos de forma uniforme --- name: solution # Composite: Solución ### Un _composite_ crea una interfaz (`interface` o `abstract`) común para las composiciones de objetos (nodos) y los objetos individuales (hojas) ### Un _composite_ usa polimorfirmo, ya que todas las clases que implementan la interfaz común tienen el mismo comportamiento (subtipos de la interfaz común) ### El cliente usa la interfaz común para manipular cualquier objeto, sin tener que comprobar si es composición u objeto individual --- name: structure class: right, top background-image: url(images/DivingDesingPatterns11.png) background-size: contain # Composite: Estructura ??? Image credits: [refactoring.guru](https://refactoring.guru/es/design-patterns/composite) La agregación (tipo especializado de asociación) representa relaciones “uno a muchos”, “muchos a muchos” o “todo a parte” entre múltiples objetos. Aquí, jerarquías "todo-parte" `Component` puede ser interfaz o clase abstracta. Lo segundo permite definir comportamientos por defecto de los métodos base Recursividad: Un `Composite` contiene elementos `Component` y un `Component` puede ser `Leaf` o `Composite`. --- class: top, right background-image: url(images/HeadFirstDesingPatterns03.png) background-size: contain Menus .small[<a name=cite-freeman2004></a>[[Fre+04](#bib-freeman2004)]] --- #
¿Cualés son ciertas según el diagrama UML del patrón `Composite`? .large[
La clase `Composite` es capaz de agregar clases `Component`, lo que creará una estructura en forma de árbol.] .large[
La clase `Leaf` hereda de la clase `Composite`, lo que permite que `Leaf` tenga el mismo comportamiento que `Composite`. ] .large[
Podemos usar declaraciones if-else para determinar el tipo de un objeto.] .large[
Cada clase individual es un subtipo de una interfaz o superclase y podrá ajustarse a un conjunto de comportamientos compartidos.] ??? 1001 --- name: aplicability # Composite: Aplicabilidad .large[
Cuando tengas que implementar una estructura de objetos que puede reprensentarse como un árbol] -- .large[
Cuando quieras que el código cliente trate objetos simples (hoja) y complejos (nodos) de la misma forma] --- name: summary # Resumen ### El patrón Composite... .large[
modela composiciones de objetos y objetos individuales en un jerarquía de todo-parte] .large[
tiene un diseño polimórfico, así los clientes pueden aplicar las mismas operaciones sobre toda o una parte de la jerarquía] .large[
explota la recursividad (_recursive composition_), ya que un `Composite` puede contener otros objectos `Composite` o `Leaf`] .large[
"rompe" el todo en partes, pero tanto el todo como las partes se adhieren a un tipo común] --- # Referencias <a name=bib-freeman2004></a>[Freeman, Eric, Elisabeth Robson, et al.](#cite-freeman2004) (2004). _Head First Design Patterns, 1st edition_. ISBN: 978-059600712.