Patrones de Diseño. Patrón estructural Composite. Técnicas de Programación - Curso 2008/09 (Esther Guerra Sánchez)



Documentos relacionados
Patrones de Diseño. Patrón estructural Composite. Técnicas de Programación - Curso 2007/08

Factory method (Gamma et al.)

Patrones de diseño. Patrón básico Handler. Técnicas de Programación - Curso 2008/09 (Esther Guerra Sánchez)

Programación Orientada a Objetos en Java

Patrones de Diseño. Patrón estructural Decorator. Técnicas de Programación - Curso 2008/09 (Esther Guerra Sánchez)

Tema: Patrones de Diseño.

Clases abstractas e interfaces

Tema 3: Herencia en C++ Programación Orientada a Objetos Curso 2008/2009 Begoña Moros Valle

Programación orientada a objetos

Programación Orientada a Objetos con Java

Introducción a la Programación Orientada a Objetos

EXAMEN FINAL Metodología y Programación Orientada a Objetos. Curso Cuatrimestre de otoño. 17 de Enero de 2011

2.2.- Paradigmas de la POO

Patrones Creacionales Builder. Patrones Creacionales Abstract Factory. Patrones Creacionales Singleton. Patrones Creacionales Prototype

SOLUCION PARCIAL TASK SCHEDULER. Task Scheduler

Curso de Java POO: Programación orientada a objetos

POLIMORFISMO "una interfaz, múltiples métodos".

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Lenguajes de Programación Curso Práctica 4. Herencia. Utilización de interfaces y clases abstractas. 1. Interfaces Clases abstractas 2

FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2005

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

Java Inicial (20 horas)

NIVEL 15: ESTRUCTURAS RECURSIVAS BINARIAS

Programación en Java. Programación en OO

Tema 3: Genericidad en Java. Tema 3: Genericidad en Java. Objetivos y Bibliografía. Modelos de Datos Genéricos

Tema 2. Técnicas básicas de POO. Técnicas de Programación - Curso 2007/08

CONTENIDOS. 1. Completar el ejemplo de Herencia: Superclase Persona-Subclase Alumno

Benemérita Universidad Autónoma del Estado de Puebla

class Nombre_Clase extends Nombre_SuperClase { cuerpo de la clase extendida }

19. Packages o paquetes

PROGRAMACION ORIENTADA A OBJETOS Ingenieria Informática Final Febrero 2006/07

Universidad de Cantabria

Notación UML para modelado Orientado a Objetos

PHP y MySQL. Inicio: - Herencia - Palabra clave Final - Polimorfismo - Type Hinting - Abstracción de clases

Tema: Sobrecarga de Operadores.

1. Qué tipos de relación hay entre las siguientes clases?

9. Objetos y clases Clases

Patrones de Diseño. Ezequiel Postan. 1 Libro e índice. 2 Introducción

15. Parámetros o argumentos

Java en 3 horas. Ampliación de Sistemas Operativos. Rodrigo Santamaría

Tema 6. Reutilización de código. Programación Programación - Tema 6: Reutilización de código

Compiladores e Intérpretes Proyecto N 1 Sintaxis de MiniJava Segundo Cuatrimestre de 2015

Clases. Java: Clases y Objetos. Clases. Clases. Modificadores de clase. Definición de una clase. Cada objeto es un ejemplar de una clase

ISTP CIDET COMPUTACION E INFORMATICA ARREGLOS EN JAVA

Relaciones entre clases: Diagramas de clases UML

11. Algunas clases estándar de Java (II)

Identificadores, palabras reservadas, tipos de datos, operadores aritméticos y el sistema estándar de salida en Java

GUIA PROGRAMACIÓN ORIENTADA A OBJETOS

Patrón Fábrica Abstracta. Julio Ariel Hurtado Alegría Ingeniería de Software II 2015

Introducción al lenguaje JAVA

Capítulo 4 Patrones y Patrones de Diseño (ii)

DIAGRAMA DE CLASES EN UML

Árbol binario. Elaborado por Ricardo Cárdenas cruz Jeremías Martínez Guadarrama Que es un árbol Introducción

Uso de excepciones en Java

Introducción. Herencia y Polimorfismo. Ejemplos (I) Ejemplos (II) Control de Acceso. Herencia

Definición de clases: Herencia, polimorfismo, ligadura dinámica

Uso de Java Swing. Noviembre de 2013

Arquitectura Cliente/Servidor. Invocación de Métodos Remotos RMI: Remote Method Invocation. Llamadas a Métodos Remotos

Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º

Árboles. Cursos Propedéuticos Dr. René Cumplido M. en C. Luis Rodríguez Flores

2. Estructura de un programa en Java

Herencia. 3.- Herencia. Declaración de una clase derivada en Delphi. Jerarquía de clases

Ejercicio 1 (3 puntos).-

Repaso de las características más importantes de la programación Java y su adaptación a Android

INDICE DEL CURSO APRENDER PROGRAMACIÓN JAVA DESDE CERO. PROGRAMACIÓN ORIENTADA A OBJETOS (CU00601B)

Programación Orientada a Objetos. Java: Excepciones

Grados Ing. Inf. y Mat. Inf. Julio 2014 Algoritmos y Estructura de Datos Página 1 de 6

Java en 2 horas. Rodrigo Santamaría

2. Conceptos básicos Abstracción La abstracción como un proceso mental natural La abstracción en el desarrollo de software

Patrones de diseño: Test 1

El Modelo de Geometrías

Objetivo de aprendizaje del tema

Modelos y Bases de Datos

PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez

Prof. Dr. Paul Bustamante

Tema 2. El lenguaje de programación Java (Parte 1)

DISEÑO DE UNA ARQUITECTURA CLIENTE/SERVIDOR MEDIANTE OBJETOS DISTRIBUIDOS EN JAVA

Java: Clases Abstractas e Interfaces

Clases y funciones amigas: friend

Elementos léxicos del lenguaje de programación Java

1. Introducción a los objetos

ELO329: Diseño y Programación Orientados a Objetos 20 de Junio de Certamen Final

Análisis de esquemas XML [1]

Patrones para persistencia (I) Ingeniería del Software II

Introducción a la programación orientada a objetos y al lenguaje JAVA Colegio Reuven Feuerstein --Javier Navarro

3.9 Patrón Distributed callback

Tutorial de UML. Introducción: Objetivos: Audiencia: Contenidos:

El patrón Composite (Compuesto) Propósito Componer los objetos a una estructura de jerarquía de relación partetodo.

Estructura de las Aplicaciones Orientadas a Objetos El patrón Modelo-Vista-Controlador (MVC)

Java RMI. Sistemas Distribuidos Rodrigo Santamaría

Conceptos. ELO329: Diseño y Programación Orientados a Objetos. ELO 329: Diseño y Programación Orientados a Objetos

Tema 1. Introducción a los TAD

Modelo de Objetos Distribuidos

Sistemas Operativos Práctica 4

Pruebas de unidad con JUnit

Práctica sobre compartición de instancias remotas.

Práctica 2 Gráficos Vectoriales con SVG (versión )

INDICE Uso de la composición (I). Preservación de la ocultación Utilización de miembros heredados (I). Atributos...

Un elemento de cualquier clase llamada Info; Un puntero a un nuevo nodo llamado sig; De tal forma una unión de nodos hace que tengamos una lista:

Pilares de la Orientación a Objetos

Transcripción:

Patrones de Diseño Patrón estructural Composite Técnicas de Programación - Curso 2008/09 (Esther Guerra Sánchez)

Propósito Componer objetos en estructuras arbóreas para representar jerarquías todo-parte. Manipular todos los objetos del árbol de manera uniforme Motivación Ej.: las aplicaciones gráficas manejan grupos de figuras hechas de componentes sencillos (líneas, texto...) Solución: Primitivas para los componentes sencillos, y otras para los contenedores? No porque no se tratan de manera uniforme Definir una clase abstracta que represente componentes y contenedores, de la cual todas heredan, y que define sus operaciones

Motivación Aplicación Grafico pintar() anyadir(grafico g) eliminar(grafico g) obtenerhijo(int i) graficos * Linea Rectangulo Texto Dibujo pintar() pintar() pintar() pintar() anyadir(grafico g) eliminar(grafico g) obtenerhijo(int i) para todo g en graficos: g.pintar() añadir g a graficos

Aplicabilidad Usa el patrón Composite cuando: Quieres representar jerarquías de objetos todo-parte Quieres ser capaz de ignorar la diferencia entre objetos individuales y composiciones de objetos. Los clientes tratarán a todos los objetos de la estructura compuesta uniformemente.

Estructura Client Component operation() add(component) remove(component) getchild(int) children * Ejemplo de estructura-objeto: :acomposite :acomposite :aleaf :aleaf :acomposite :aleaf :aleaf :aleaf Leaf operation() Composite operation() add(component) remove(component) getchild(int) for (Component c : children) c.operation()

Participantes Component (Grafico): define la interfaz común para los objetos de la composición define la interfaz para acceder y gestionar los hijos puede definir un comportamiento por defecto común a las subclases (opcional) define la interfaz para acceder al padre de un componente en la estructura recursiva, y la implementa si es apropiado Leaf (Linea, Rectangulo, Texto): representa los objetos hoja (sin hijos) de la composición define comportamiento para los objetos primitivos Composite (Dibujo): define comportamiento para los componentes que tienen hijos almacena componentes hijo implementa las operaciones de Component para la gestión de hijos Client: manipula los objetos de la composición a través de la interfaz Component

Colaboraciones. Ejemplo c1:composite c2:composite l2:leaf l3:leaf l1:leaf :Client c1:composite c2:composite l1:leaf l2:leaf l3:leaf operation() operation() operation() operation() operation()

Consecuencias Define jerarquías de clases hechas de objetos primitivos y compuestos. Si el código cliente espera un objeto simple, puede recibir también uno compuesto Simplifica el cliente. Objetos simples y compuestos se tratan homogéneamente Facilita la incorporación de nuevos tipos de componentes Puede hacer el diseño demasiado general. Es complicado restringir el tipo de componentes de un composite.

Implementación Referencias explícitas a los padres Simplifica algunas operaciones de la estructura compuesta Definirlas en la clase Component Gestionarlas al añadir/eliminar elementos de un Composite parent Leaf Component children * Composite Compartir componentes Útil para ahorrar memoria public abstract class Component { protected Component parent; public void setparent (Component parent) { this.parent = parent; public void add (Component c) { c.setparent(this);...... La gestión de un componente con varios padres se complica

Implementación Maximizar la interfaz del componente Uno de los objetivos del Composite: que los clientes no tengan que saber si están tratando con clases compuestas o con hojas Dar comportamiento por defecto que sobrescribirán las subclases Ej: por defecto getchildren no devuelve hijos, lo cual es válido para las hojas, pero los compuestos deben sobrescribir la operación Declaración de las operaciones de gestión de hijos Definirlas en la raíz Component y dar implementación por defecto Se obtiene transparencia, se pierde seguridad ( cómo evitar que un cliente añada/elimine objetos a una hoja?) Definirlas en Composite Se obtiene seguridad, se pierde transparencia (interfaz no uniforme) Si se pierde el tipo hay que hacer downcasting, lo cual es inseguro

Implementación Debe declarar Component una lista de componentes? Penalización de espacio por cada hoja, incluso si no tiene hijos A veces los hijos tienen un orden (patrón iterator) Quién debe borrar los componentes? Si no hay recolector de basura, el Composite (excepto si las hojas pueden estar compartidas) Cuál es la mejor estructura de datos para almacenar los componentes?

Código de ejemplo (1) public interface Component { public void add (Component c); public void remove (Component c); public Component getchild (int i); public class Leaf implements Component { public void add (Component c) { // también puede lanzar una excepción public void remove (Component c) { // también puede lanzar una excepción public Component getchild (int i) { return null; public class Composite implements Component { private Vector _children = new Vector(); public void add (Component c) { _children.addelement(c); public void remove (Component c) { _children.removeelement(c); public Component getchild (int i) { return _children.elementat(i);

Código de ejemplo (2) public abstract class Component { public void add (Component c) { // también puede lanzar una excepción public void remove (Component c) { // también puede lanzar una excepción public Component getchild (int i) { return null; public class Leaf extends Component { public class Composite extends Component { private Vector _children = new Vector(); public void add (Component c) { _children.addelement(c); public void remove (Component c) { _children.removeelement(c); public Component getchild (int i) { return _children.elementat(i);

Código de ejemplo (3) public interface Component { public Composite getcomposite (); public class Leaf implements Component { public Composite getcomposite () { return null; public class Composite implements Component { private Vector _children = new Vector(); public void add (Component c) { _children.addelement(c); public void remove (Component c) { _children.removeelement(c); public Component getchild (int i) { return _children.elementat(i); public Composite getcomposite () { return this; // código cliente Composite acomposite = new Composite(); Leaf aleaf = new Leaf(); Component acomponent; acomponent = acomposite; if (acomponent == acomponent.getcomposite()) test.add(new Leaf()); // añadirá la hoja acomponent = aleaf; if (acomponent == acomponent.getcomposite()) test.add(new Leaf()); // no añadirá la hoja

En java En el paquete java.awt.swing Component Component Composite Container (abstracta) Panel (concreta) Frame (concreta) Dialog (concreta) Leaf: Label TextField Button

Ejercicio Se quiere construir un editor de expresiones matemáticas. Especificar el diagrama de clases que permita representar expresiones válidas. Una expresión válida estará formada o bien por un número, o bien por la suma/resta/división/multiplicación de dos expresiones Ejemplos de expresiones válidas: 4 3+8 14 * (3+5)...

Solución posible 1 Editor Expresion add(expresion) remove(expresion) getoperando(int) operandos 2 Numero -num Operacion -tipo add(expresion) remove(expresion) getoperando(int)

Solución posible 2 Editor Expresion add(expresion) remove(expresion) getoperando(int) operandos 2 Numero -num Operacion add(expresion) remove(expresion) getoperando(int) Suma Resta Multi Division