Vous êtes sur la page 1sur 68

Tema 3 Herencia en Java, parte 2

Programacin Orientada a Objetos Curso 2010/2011

Contenido
Genericidad. Colecciones. Patrones de Diseo:
Mtodo plantilla. Estrategia. Composicin.

Curso 2010/2011

Programacin Orientada a Objetos

Genericidad
Facilidad de un lenguaje de programacin para definir clases parametrizadas con tipos de datos. Resultan de utilidad para la implementacin de tipos de datos contenedores como las colecciones. La genericidad slo tiene sentido en lenguajes con comprobacin esttica de tipos, como Java o C#. La genericidad permite escribir cdigo reutilizable.
Curso 2010/2011 Programacin Orientada a Objetos 3

Clase Contenedor
public class Contenedor<T> { private T contenido; public void setContenido(T contenido) { this.contenido = contenido; } public T getContenido() { return contenido; } }
Curso 2010/2011 Programacin Orientada a Objetos 4

Genericidad
La parametrizacin de una clase genrica se realiza en la declaracin de una variable y en la construccin.

Contenedor<String> contenedor = new Contenedor<String>(); contenedor.setContenido("hola");

Curso 2010/2011

Programacin Orientada a Objetos

Operaciones sobre tipos genricos


Podemos aplicar la asignacin (=) y la comparacin de identidad (== o !=). Tambin las operaciones aplicables sobre cualquier objeto (mtodos de la clase Object) Dentro de la clase genrica, no es posible construir objetos de un tipo genrico:
T contenido = new T(); // No compila

Es posible aplicar ms operaciones aplicando genericidad restringida.


Curso 2010/2011 Programacin Orientada a Objetos 6

Genericidad
Una clase genrica es una clase normal, salvo que dentro de su declaracin utiliza un tipo variable (parmetro), que ser definido cuando sea utilizada. Dentro de una clase genrica se pueden utilizar otras clases genricas. Una clase genrica puede tener varios parmetros.
public class ContenedorDoble <T,K> { private String nombre; private Contenedor<T> clave; private K valor; } ContenedorDoble<String, Cuenta> contenedor =
Curso 2010/2011 Programacin Orientada a Objetos 7

Genericidad y tipos primitivos


Las clases genricas no pueden ser parametrizadas a tipos primitivos. Para resolver este problema el lenguaje define clases envoltorio de los tipos primitivos:
Integer, Float, Double, Character, Boolean, etc.

El compilador transforma automticamente tipos primitivos en clases envoltorio y viceversa: autoboxing.


Contenedor<Integer> contenedor = new Contenedor<Integer>(); contenedor.setContenido(10); int valor = contenedor.getContenido();
Curso 2010/2011 Programacin Orientada a Objetos 8

Genericidad restringida
Objetivo: limitar los tipos a los que puede ser parametrizada una clase genrica. Al restringir los tipos obtenemos el beneficio de poder aplicar mtodos sobre los objetos de tipo genrico. Una clase con genericidad restringida slo permite ser parametrizada con tipos compatibles con el de la restriccin (clase o interfaz).

Curso 2010/2011

Programacin Orientada a Objetos

Genericidad restringida
La clase CarteraAhorro slo puede ser parametrizada con tipos compatibles con Deposito. Podemos aplicar mtodos disponibles en la clase Deposito.
public class CarteraAhorro<T extends Deposito> { private LinkedList<T> contenido; public void liquidar() { for (T deposito : contenido) deposito.liquidar(); } }
Curso 2010/2011 Programacin Orientada a Objetos 10

Genericidad restringida
Son equivalentes?
public class CarteraAhorro<T extends Deposito> { private LinkedList<T> contenido; public void insertar(T deposito) { contenido.add(deposito); } } public class CarteraAhorro { private LinkedList<Deposito> contenido; public void insertar(Deposito deposito) { contenido.add(deposito); } }
Curso 2010/2011 Programacin Orientada a Objetos 11

Genericidad restringida
Con genericidad restringida podemos declarar la siguiente variable:
CarteraAhorro<DepositoGarantizado> seguro = ;

Es posible especificar el tipo de depsito de la cartera, compatible con Deposito. En el ejemplo slo podran introducirse depsitos garantizados y subtipos.

En cambio, con la segunda declaracin no podemos restringir el tipo de depsito. Podemos mezclar distintos tipos de objetos depsito.

Curso 2010/2011

Programacin Orientada a Objetos

12

Genericidad restringida
Una clase genrica puede estar restringida por varios tipos:
public class Contenedor<T extends Deposito & Amortizable>

Por tanto, las operaciones disponibles para objetos de tipo T son las de todos los tipos.

Curso 2010/2011

Programacin Orientada a Objetos

13

Genericidad y herencia
Una clase puede heredar de una clase genrica. La nueva clase tiene las opciones:
Mantener la genericidad de la clase padre.
public class CajaSeguridad<T> extends Contenedor<T>

Restringir la genericidad.
public class CajaSeguridad<T extends Valorable> extends Contenedor<T>

No ser genrica y especificar un tipo concreto.


public class CajaSeguridad extends Contenedor<Valorable>

Curso 2010/2011

Programacin Orientada a Objetos

14

Genericidad y sistema de tipos


Contenedor<Deposito> Deposito

No hay relacin
DepositoEstructurado Contenedor<DepositoEstructurado>

Contenedor<Deposito> cDeposito; Contenedor<DepositoEstructurado> cEstructurado; cDeposito = cEstructurado; // No compila

Curso 2010/2011

Programacin Orientada a Objetos

15

Genericidad y sistema de tipos


Cuando se declara una variable cuyo tipo se corresponde con una clase genrica y no se especifica el parmetro se asigna el tipo puro (raw) que corresponde a:
Sin genericidad restringida, la clase Object. Con genericidad restringida, la clase a la que se restringe.

Contenedor contenedor = new Contenedor(); // Object CarteraAhorro cartera = new CarteraAhorro(); // Deposito

Siendo:
Clase Contenedor<T> Clase CarteraAhorro<T extends Deposito>
Curso 2010/2011 Programacin Orientada a Objetos 16

Genericidad y tipos comodn


El mtodo slo permite objetos de tipo List<Deposito>.
public double posicionGlobal(List<Deposito> depositos) { double posicion = 0; for (Deposito deposito : depositos) { posicion += deposito.getCapital(); } return posicion; }

Cmo podemos pasar un lista de depsitos estructurados?


Curso 2010/2011 Programacin Orientada a Objetos 17

Genericidad y tipos comodn


public double posicionGlobal( List<? extends Deposito> depositos)

Se utiliza un comodn, que significa: permite cualquier lista genrica parametrizada a la clase Depsito o a un tipo compatible (subclase). Si pasamos como parmetro un objeto List<DepositoEstructurado>, ste ser el tipo reconocido dentro del mtodo. El tipo comodn se puede usar para declarar variables locales o atributos. No se puede utilizar el tipo comodn para construir objetos.

Curso 2010/2011

Programacin Orientada a Objetos

18

Genericidad y mquina virtual


La mquina virtual no maneja objetos de tipo genrico. En tiempo de ejecucin se pierde la informacin sobre el tipo utilizado para parametrizar la clase genrica.
Todo tipo genrico (clase genrica parametrizada) se transforma a un tipo puro.

Con el operador instanceof slo podemos preguntar por el nombre de la clase.


// No compila if (contenedor instanceof Contenedor<Deposito>) { } // S compila if (contenedor instanceof Contenedor) { }
Curso 2010/2011 Programacin Orientada a Objetos 19

Genericidad basada en Object


La genericidad fue introducida en Java a partir de la versin 5. Antes de esa versin, las clases genricas se definan utilizando el tipo Object en lugar de un tipo genrico. Una referencia de tipo Object puede referenciar a cualquier objeto. Este modelo est en desuso, aunque an existe cdigo que trabaja con la genericidad basada en Object.
Curso 2010/2011 Programacin Orientada a Objetos 20

Genericidad basada en Object


public class Contenedor { private Object contenido; public void setContenido(Object contenido) { this.contenido = contenido; } public Object getContenido() { return contenido; } }
Curso 2010/2011 Programacin Orientada a Objetos 21

Genericidad basada en Object


El compilador no ayuda en el control de tipos. El uso correcto de los tipos queda en manos del programador.
Para extraer objetos es necesario hacer siempre un casting que podra fallar.
Contenedor contenedor = new Contenedor (); contenedor.setContenido("hola"); Deposito d = (Deposito)contenedor.getContenido(); // Error de casting en tiempo de ejecucin.

Curso 2010/2011

Programacin Orientada a Objetos

22

Seminario 3
En el Seminario 3 se incluye un apartado que trata la genericidad. Se incluyen los siguientes ejemplos:
Genericidad basada en Object. Definicin de una clase genrica. Genericidad restringida.

Curso 2010/2011

Programacin Orientada a Objetos

23

Colecciones en Java
Las colecciones en Java son un ejemplo destacado de implementacin de cdigo reutilizable utilizando un lenguaje orientado a objetos. Todas las colecciones son genricas. Los tipos abstractos de datos se definen como interfaces. Se implementan clases abstractas que permiten factorizar el comportamiento comn a varias implementaciones. Un mismo TAD puede ser implementado por varias clases List: LinkedList, ArrayList

Curso 2010/2011

Programacin Orientada a Objetos

24

Colecciones en Java
Iterator
devuelve

Collection

devuelve

Map

devuelve

ListIterator

List

Set

SortedMap

AbstractMap

AbstractCollection AbstractList

SortedSet

TreeMap

HashMap

AbstractSet HashSet TreeSet

ArrayList

AbstractSequentialList LinkedList

extends implements interface class

Curso 2010/2011

Programacin Orientada a Objetos

25

Interfaz Collection<T>
Define las operaciones comunes a todas las colecciones de Java. Permite manipular colecciones basndonos en su interfaz en lugar de en la implementacin. Los tipos bsicos de colecciones son:
Listas, definidas en la interfaz List<T> Conjuntos, definidos en la interfaz Set<T>

Curso 2010/2011

Programacin Orientada a Objetos

26

Interfaz Collection<T>
Operaciones bsicas:
size(): devuelve el nmero de elementos. isEmpty(): indica si tiene elementos. add(T e): aade un elemento a la coleccin. Retorna un booleano indicando si acepta la insercin. remove(Object e): intenta eliminar el elemento. Retorna un booleano indicando si ha sido eliminado. clear(): elimina todos los elementos. contains(Object e): indica si contiene el objeto

pasado como parmetro.


Curso 2010/2011 Programacin Orientada a Objetos

27

Interfaz List<T>
La interfaz List<T> define secuencias de elementos a los que se puede acceder atendiendo a su posicin. Las posiciones van de 0 a size()-1.
El acceso a una posicin ilegal produce la excepcin IndexOutOfBoundsException

El mtodo add(T e) aade al final de la lista. Aade a las operaciones de Collection mtodos de acceso por posicin como:
T get (int index) T set (int index, T element) void add (int index, T element) T remove (int index)
Curso 2010/2011 Programacin Orientada a Objetos 28

Implementaciones de Listas
ArrayList<T> Implementacin basada en arrays redimiensionables. Operaciones de insercin y modificacin ineficientes. Operaciones de creacin y consulta rpidas. LinkedList<T> Implementacin basada en listas doblemente enlazadas Inserciones y modificaciones rpidas, especialmente en el principio y el final:
addFirst, addLast, removeFirst, removeLast

Acceso aleatorio a elementos ineficiente Acceso eficiente al principio y al final de la lista:


getFirst y getLast
Curso 2010/2011 Programacin Orientada a Objetos 29

Ejemplo uso de listas


import java.util.List; import java.util.LinkedList; public class Persona { private final String dni; private String nombre; private LinkedList<ProductoFinanciero> productosContratados; public Persona(String dni, String nombre){ this.dni = dni; this.nombre = nombre; productosContratados = new LinkedList<ProductoFinanciero>(); }

Curso 2010/2011

Programacin Orientada a Objetos

30

Ejemplo uso de listas


public void addProducto(ProductoFinanciero producto){ productosContratados.add(producto); } public void removeProducto(ProductoFinanciero producto){ productosContratados.remove(producto); } public List<ProductoFinanciero> getProductosContratados(){ return new LinkedList<ProductoFinanciero>( productosContratados); } }

Se debe utilizar el tipo de la interfaz como valor de retorno. Todas las colecciones disponen del constructor de copia.
Curso 2010/2011 Programacin Orientada a Objetos 31

Interfaz Set<T>
La interfaz Set<T> define conjuntos de elementos no repetidos. Para evitar la insercin de elementos repetidos, la igualdad de los objetos se comprueba con equals. Implementaciones de conjuntos:
HashSet<T> guarda los elementos del conjunto en una tabla hash. TreeSet<T> implementacin de conjuntos ordenados basada en rboles binarios balanceados.

Las operaciones de bsqueda y modificacin son ms lentas en TreeSet que en HashSet

Curso 2010/2011

Programacin Orientada a Objetos

32

Interfaz Map<K,V>
La interfaz Map<K,V> define el tipo de datos que representa pares <clave, valor>
Un mapa no puede tener claves duplicadas. Cada clave slo puede tener un valor asociado.

Un mapa no es una coleccin, sin embargo contiene distintas colecciones:


Conjunto de claves (Set<K>) Coleccin de valores (Collection<V>) Conjunto de pares <clave, valor> (Map.Entry<K,V>)

Las implementaciones disponibles son:


HashMap<T>: implementacin basada en una tabla hash TreeMap<T>: implementacin basada en rboles balanceados.
Las claves estn ordenadas (SortedSet<K>).

Curso 2010/2011

Programacin Orientada a Objetos

33

Interfaz Map<K,V>
Mtodos bsicos:
V put(K clave, V valor): inserta una asociacin en el

mapa.
Retorna el valor de la antigua asociacin, si la hubiera. V get(clave): retorna el valor asociado a una clave. Si la asociacin no existe, devuelve nulo. Set<K> keySet(): devuelve el conjunto de claves. Collection<V> values(): devuelve la coleccin de valores. boolean containsKey(key): indica si existe una clave. Set<Map.Entry<K, V>> entrySet(): devuelve el conjunto

de todas las asociaciones, Map.Entry<K, V>:


getKey(): consultar la clave. getValue(): consultar el valor.

Curso 2010/2011

Programacin Orientada a Objetos

34

Ejemplo clase Sucursal


public class Sucursal { private int codigo; private String direccion; private HashMap<Persona, LinkedList<ProductoFinanciero>> pasivo; public Sucursal(int codigo, String direccion){ this.codigo = codigo; this.direccion = direccion; pasivo = new HashMap<Persona, LinkedList<ProductoFinanciero>>(); } public void addContrato(Persona cliente, ProductoFinanciero producto) { public Set<Persona> getClientes(){ public Set<ProductoFinanciero> getProductosContratados(){ }
Curso 2010/2011 Programacin Orientada a Objetos 35

Ejemplo clase Sucursal


public void addContrato(Persona cliente, ProductoFinanciero producto) { LinkedList<ProductoFinanciero> productos; if (! pasivo.containsKey(cliente)) { productos = new LinkedList<ProductoFinanciero>(); pasivo.put(cliente, productos); } else productos = pasivo.get(cliente); productos.add(producto); }

Curso 2010/2011

Programacin Orientada a Objetos

36

Ejemplo clase Sucursal


public Set<Persona> getClientes(){ return new HashSet<Persona>(pasivo.keySet()); } public Set<ProductoFinanciero> getProductosContratados(){ Collection<LinkedList<ProductoFinanciero>> productos; productos = pasivo.values(); Set<ProductoFinanciero> cjtoProductos = new HashSet<ProductoFinanciero>(); for (LinkedList<ProductoFinanciero> lista : productos) cjtoProductos.addAll(lista); return cjtoProductos; }

Curso 2010/2011

Programacin Orientada a Objetos

37

Orden de los objetos


El orden utilizado por las colecciones ordenadas (SortedSet, SortedMap) puede ser el orden natural de los objetos (por defecto) o el criterio de ordenacin que se establece en el constructor. La interfaz Comparable impone el orden natural de los objetos de las clases que la implementan.
public interface Comparable<T> { public int compareTo(T o); }

El mtodo compareTo devuelve un entero positivo si la relacin es mayor que, negativo si es menor que y cero si son iguales.
Curso 2010/2011 Programacin Orientada a Objetos 38

Orden natural de Cuenta


public class Cuenta implements Comparable<Cuenta>{ public int compareTo(Cuenta otraCta) { if (this.codigo > otraCta.codigo) return 1; else if (this.codigo < otraCta.codigo) return -1; else return 0; } }

Curso 2010/2011

Programacin Orientada a Objetos

39

TreeSet<Cuenta> orden natural


public class Persona { private TreeSet<Cuenta> misCuentas; public Persona(String dni, String nombre){ //TreeSet utiliza el orden natural de la clase Cuenta misCuentas = new TreeSet<Cuenta>(); } /** * Aade una cuenta a la coleccin de la persona que es titular * @param cta Cuenta a aadir en la coleccin * @return true si la cuenta se ha aadido y false en caso contrario */ public boolean addCuenta(Cuenta cta){ return misCuentas.add(cta); } }

Curso 2010/2011

Programacin Orientada a Objetos

40

Criterios de ordenacin
Para definir un criterio de ordenacin hay que implementar la interfaz Comparator.
public interface Comparator<T> { public int compare(T o1, T o2); }

El mtodo compare devuelve un entero positivo si la relacin es mayor que, negativo si es menor que y cero si son iguales.

Curso 2010/2011

Programacin Orientada a Objetos

41

Criterios de ordenacin para Cuenta


public class OrdenSaldo implements Comparator<Cuenta>{ public int compare(Cuenta o1, Cuenta o2) { if (o1.getSaldo() > o2.getSaldo()) return 1; else if (o1.getSaldo() < o2.getSaldo()) return -1; else return 0; } } public class OrdenTitular implements Comparator<Cuenta>{ public int compare(Cuenta o1, Cuenta o2) { return (o1.getTitular().getNombre(). compareTo(o1.getTitular().getNombre())); } }
Curso 2010/2011 Programacin Orientada a Objetos 42

TreeSet<Cuenta> con criterio de ordenacin


public class Persona { private TreeSet<Cuenta> misCuentas;

public Persona(String dni, String nombre){ misCuentas = new TreeSet<Cuenta>(new OrdenTitular()); //TreeSet utiliza el orden establecido //en la clase OrdenTitular para ordenar las cuentas } }

Curso 2010/2011

Programacin Orientada a Objetos

43

Iteradores
Las colecciones de Java son iterables, es decir, podemos recorrer todos sus elementos. Se utilizan iteradores para que el cdigo que realiza el recorrido no conozca las particularidades de la estructura de datos: lista enlazada, lista basada en arrays, etc.

public double posicionGlobal(List<Deposito> depositos) { double posicion = 0; for (Deposito deposito : depositos) { posicion += deposito.getCapital(); } return posicion; }
Curso 2010/2011 Programacin Orientada a Objetos 44

Iteradores
Java proporciona la interfaz Iterable<T> que debe ser implementada por aquellas clases sobre las que se pueda iterar:
public interface Iterable<T> { Iterator<T> iterator(); }

A los objetos iterables se les exige que creen objetos iterador (Iterator) para realizar la iteracin. Los arrays y la interfaz Collection son iterables.
Curso 2010/2011 Programacin Orientada a Objetos 45

Iteradores
Interfaz Iterator<T>:
hasNext(): indica si quedan elementos en la iteracin. next(): devuelve el siguiente elemento de la iteracin. remove(): elimina el ltimo elemento devuelto por el iterador.
public interface Iterator<T> { boolean hasNext(); T next(); void remove(); }
Curso 2010/2011 Programacin Orientada a Objetos 46

Recorrido for each


El recorrido for each permite recorrer objetos iterables sin manejar un objeto iterador. Es la opcin ms comn de recorrido.

public double posicionGlobal(List<Deposito> depositos) { double posicion = 0; for (Deposito deposito : depositos) { posicion += deposito.getCapital(); } return posicion; }

Curso 2010/2011

Programacin Orientada a Objetos

47

Recorrido explcito con iterador


Interesa manejar un iterador cuando queremos eliminar algn elemento de la coleccin.
En Java slo se puede modificar una coleccin que se est recorriendo utilizando el iterador.

public double filtrar(List<Deposito> depositos) { Iterator<Deposito> it = depositos.iterator(); while (it.hasNext()) { Deposito deposito = iterator.next(); if (deposito.getCapital() < 1000) it.remove(); } }
Curso 2010/2011 Programacin Orientada a Objetos 48

Patrones de diseo
Soluciones a problemas que aparecen recurrentemente en la Programacin Orientada a Objetos. Diseo de clases reutilizable que se puede adaptar a diferentes situaciones. La definicin de un patrn de diseo es independiente del lenguaje que se utilice para implementarlo. Vamos a estudiar: Patrn Mtodo Plantilla. Patrn Estrategia. Patrn Composicin.
Curso 2010/2011 Programacin Orientada a Objetos 49

Mtodo Plantilla
Define en un mtodo el esqueleto de un algoritmo, delegando en las subclases algunos de sus pasos. Permite que las subclases implementen ciertos pasos del algoritmo sin cambiar su estructura. El algoritmo factoriza un comportamiento comn a un conjunto de subclases. El algoritmo se implementa en un mtodo efectivo que har uso de otros mtodos abstractos de la clase.
Curso 2010/2011 Programacin Orientada a Objetos 50

Mtodo Plantilla

Curso 2010/2011

Programacin Orientada a Objetos

51

Mtodo Plantilla Caso de Estudio


En la aplicacin bancaria a los titulares de los productos financieros se les enva la informacin fiscal. La informacin fiscal de un producto financiero contiene:
El nombre del titular, el producto financiero contratado, el beneficio obtenido y el valor de los impuestos cobrados.

El mtodo que genera el informe fiscal es un mtodo plantilla:


Factoriza el comportamiento comn a todos los productos financieros.
Curso 2010/2011 Programacin Orientada a Objetos

52

Mtodo Plantilla
public abstract class ProductoFinanciero { public double getImpuestos() { return getBeneficio() * 0.18; } public String getInforme(){ return "Titular:" + titular + ", producto contratado: " + getTipo() + ", beneficios: " + getBeneficio() + ", impuestos: " + getImpuestos(); } protected abstract String getTipo(); public abstract double getBeneficio(); }
Curso 2010/2011 Programacin Orientada a Objetos 53

Mtodo Plantilla
Las clases hijas implementan los mtodos necesarios para completar el mtodo plantilla.
public Deposito extends ProductoFinanciero { protected String getTipo() { return "Deposito"; } public double getBeneficio() { return getIntereses(); } }

Curso 2010/2011

Programacin Orientada a Objetos

54

Patrn Estrategia
Permite definir una familia de algoritmos que se pueden intercambiar en tiempo de ejecucin
Ejemplos: algoritmos de ordenacin, criterios de seleccin, etc.

Favorece la extensibilidad (definicin de nuevos algoritmos)


Curso 2010/2011 Programacin Orientada a Objetos 55

Patrn Estrategia Caso de Estudio


En la aplicacin bancaria, supongamos que la clase Banco almacena la lista de todos los productos financieros. Cmo podemos implementar un mtodo de bsqueda que devuelva todos los productos financieros que cumplen una determinada condicin? La condicin de bsqueda puede cambiar de una bsqueda a otra:
Todos los depsitos con el capital mayor que 10000 Todos los productos contratados por Juan Gonzlez

En Java no es posible pasar un mtodo como parmetro.


Curso 2010/2011 Programacin Orientada a Objetos

56

Aplicacin del Patrn Estrategia

La interfaz Criterio encapsula el algoritmo que representa el criterio de bsqueda.


El mtodo test evala si el ProductoFinanciero que se le pasa como parmetro cumple o no el criterio de bsqueda.

Cada criterio de bsqueda se implementa en una clase que implementa la interfaz Criterio.
Curso 2010/2011 Programacin Orientada a Objetos 57

Implementacin Patrn Estrategia


public interface Criterio { boolean test(ProductoFinanciero producto); } public class Banco { private List<ProductoFinanciero> productos; public List<ProductoFinanciero> buscar (Criterio criterio){ List<ProductoFinanciero> resultado = new LinkedList<ProductoFinanciero>(); for (ProductoFinanciero p: productos) if (criterio.test(p)) resultado.add(p); return resultado; } }
Curso 2010/2011 Programacin Orientada a Objetos 58

Implementacin Patrn Estrategia


public class CapitalAlto implements Criterio { private double umbral; public CapitalAlto(double umbral){ this.umbral = umbral; } public boolean test(ProductoFinanciero producto) { if (producto instanceof Deposito){ Deposito deposito = (Deposito)producto; return deposito.getCapital() > umbral; } else return false; } }

Curso 2010/2011

Programacin Orientada a Objetos

59

Implementacin Patrn Estrategia


Para buscar los productos que cumplen un determinado criterio de bsqueda habr que pasar como parmetro al mtodo buscar un objeto de una clase que implemente el criterio.
Banco banco = new Banco(); List<ProductoFinanciero> depositosAltos; Criterio criterio = new CapitalAlto(10000.0); depositosAltos = banco.buscar(criterio);

Curso 2010/2011

Programacin Orientada a Objetos

60

Patrn Estrategia
En el caso de estudio las estrategias se establecen como parmetro de un mtodo. La estrategia tambin puede almacenarse en un atributo:
Este atributo puede ser inicializado en la construccin del objeto con una estrategia. Se podra establecer en cualquier momento con un mtodo set. La interfaz Comparator es una estrategia de comparacin que se pasa como parmetro en el constructor de TreeSet y se almacena como atributo.

Otro caso es que la estrategia sea solicitada a los subtipos a travs de un mtodo abstracto.
Curso 2010/2011 Programacin Orientada a Objetos 61

Implementacin Patrn Estrategia


La estrategia se almacena como atributo.
public class Banco { private Criterio criterio; public void setCriterio(Criterio criterio) { this.criterio = criterio; } public List<ProductoFinanciero> filtrar (){ for (ProductoFinanciero p: productos) if (this.criterio.test(p)) resultado.add(p); return resultado; } }
Curso 2010/2011 Programacin Orientada a Objetos 62

Implementacin Patrn Estrategia


La estrategia la establecen los subtipos
public abstract class Banco { protected abstract Criterio getCriterio(); public List<ProductoFinanciero> filtrar (){ for (ProductoFinanciero p: productos) if (getCriterio().test(p)) resultado.add(p); return resultado; } }
Curso 2010/2011 Programacin Orientada a Objetos

63

Patrn Composicin
Permite representar objetos compuestos. Los clientes tratan de manera uniforme a los objetos individuales y a los compuestos.

Curso 2010/2011

Programacin Orientada a Objetos

64

Patrn Composicin Caso de estudio


Supongamos que en el banco existen carteras de negocios. Una cartera de negocios es un producto financiero. Una cartera de negocios puede est formada por otros productos financieros y tambin otras carteras.

Una cartera de negocios es un producto financiero compuesto:


El beneficio es la suma de los beneficios de todos los productos que contiene.

Curso 2010/2011

Programacin Orientada a Objetos

65

Patrn Composicin

Curso 2010/2011

Programacin Orientada a Objetos

66

Patrn Composicin
public class CarteraNegocio extends ProductoFinanciero { private List<ProductoFinanciero> productos; public CarteraNegocio(Persona titular){ super(titular); productos = new LinkedList<ProductoFinanciero>(); } public void addProducto(ProductoFinanciero p) { productos.add(p); } public void removeProducto(ProductoFinanciero p) { productos.remove(p); }

Curso 2010/2011

Programacin Orientada a Objetos

67

Patrn Composicin
public class CarteraNegocio extends ProductoFinanciero { @Override public double getBeneficio() { double total = 0;

// El beneficio es la suma de los beneficios // de sus componentes


for (ProductoFinanciero producto : productos) total += producto.getBeneficio(); return total; } }

Curso 2010/2011

Programacin Orientada a Objetos

68

Vous aimerez peut-être aussi