Patrones de diseo Patrn bsico Handler Objetivos: Diseo especfico para el problema, pero general para poder adecuarse a futuros requisitos Evitar el rediseo en la medida de lo posible Evitar resolver cada problema partiendo de cero Reutilizar soluciones que han sido tiles en el pasado Idea: Patrones recurrentes de clases y comunicacin entre objetos en muchas soluciones de diseo Reutilizar diseos abstractos que no incluyan detalles de la implementacin Patrones de diseo Introduccin Qu son: Descripcin del problema y la esencia de su solucin, que se puede reutilizar en casos distintos Solucin adecuada a un problema comn Documentar la experiencia en el diseo Tipos: De creacin: implica el proceso de instanciar objetos Estructurales: composicin de objetos De comportamiento: cmo se comunican los objetos, cooperan y distribuyen las responsabilidades para lograr sus objetivos Patrones de diseo Introduccin Nombre del patrn Describe el problema de diseo, soluciones y consecuencias Vocabulario de diseo Problema Describe cundo aplicar el patrn (aplicabilidad) Explica el problema y su contexto (motivacin) Solucin Elementos que forman el diseo, relaciones, responsabilidades No un diseo concreto, sino una plantilla que puede aplicarse en muchas situaciones distintas Consecuencias Resultados, ventajas e inconvenientes de aplicar el patrn Por ejemplo: relacin entre eficiencia en espacio y tiempo, cuestiones de implementacin, etc. Patrones de diseo Estructura de un patrn Patrn bsico Handler Propsito Sirve para manejar identificadores de objetos de manera independiente a su implementacin Permite cambiar fcilmente la implementacin de un identificador (i nt , St r i ng, ...) a cualquier tipo bsico o clase primitiva, sea sencilla o compuesta Motivacin A veces una clase tiene un identificador de cierto tipo, y puede que el tipo cambie en futuras versiones de la clase Subclases de una clase comn usan identificadores de distinto tipo Patrn bsico Handler Motivacin Ej: Una aplicacin de gestin de alumnos Los alumnos se identifican por un NIA de 10 dgitos cl ass Al umno { pr i vat e l ong ni a; publ i c Al umno ( l ong ni a) { t hi s. ni a = ni a; } publ i c l ong get Ni a ( ) { r et ur n t hi s. ni a; } publ i c bool ean esMenor ( Al umno ot r o) { i f ( t hi s. ni a < ot r o. get Ni a( ) ) r et ur n t r ue; el se r et ur n f al se; } . . . } Alumno -nia: long + esMenor (Alumno otro): boolean Patrn bsico Handler Motivacin Ej: Una aplicacin de gestin de alumnos Los alumnos se identifican por un NIA de 10 dgitos y una letra cl ass Al umno { pr i vat e l ong ni a; publ i c Al umno ( l ong ni a) { t hi s. ni a = ni a; } publ i c l ong get Ni a ( ) { r et ur n t hi s. ni a; } publ i c bool ean esMenor ( Al umno ot r o) { i f ( t hi s. ni a < ot r o. get Ni a( ) ) r et ur n t r ue; el se r et ur n f al se; } . . . } Alumno -nia: long + esMenor (Alumno otro): boolean cl ass Al umno { pr i vat e St r i ng ni a; publ i c Al umno ( St r i ng ni a) { t hi s. ni a = ni a; } publ i c St r i ng get Ni a ( ) { r et ur n t hi s. ni a; } publ i c bool ean esMenor ( Al umno ot r o) { i f ( t hi s. ni a. compar eTo( ot r o. get Ni a( ) ) ) r et ur n t r ue; el se r et ur n f al se; } . . . } Alumno -nia: String + esMenor (Alumno otro): boolean Patrn bsico Handler Motivacin Solucin: usar atributo del tipo especificado: no es flexible, si el tipo cambia puede requerir muchos cambios en el resto del sistema definir una clase de envoltura para el identificador Alumno - nia: NIA NIA + comparar (NIA) : boolean NIALong - id: long + NIALong (long) + NIALong (NIA) NIAString - id: String + NIAString (String) + NIAString (NIA) NIAArray - id: String [2] + NIAArray (String[2]) + NIAArray (NIA) cl ass Al umno { pr i vat e NI A ni a; publ i c Al umno ( NI A ni a) { t hi s. ni a = ni a; } publ i c NI A get Ni a ( ) { r et ur n t hi s. ni a; } publ i c bool ean esMenor ( Al umno ot r o) { i f ( t hi s. ni a. compar ar ( ot r o. get Ni a( ) ) ) r et ur n t r ue; el se r et ur n f al se; } . . . } Patrn bsico Handler Aplicabilidad Usa el patrn Handler cuando: tienes alguna clase que usa algn tipo de identificador Estructura Patrn bsico Handler Participantes Identifiable (Alumno): clase cliente que necesita identificar a sus objetos a travs de un atributo identificador Handler (NIA): interfaz para declarar los identificadores de los objetos de la clase I dent i f i abl e ConcreteHandler (NIALong, NIAString, NIAArray): implementacin concreta de la interfaz Handl er Patrn bsico Handler Ejemplo de Implementacin i nt er f ace Handl er { St r i ng t oSt r i ng( ) ; i nt compar eTo( Handl er ot r o) ; } cl ass Concr et eHandl er 1 i mpl ement s Handl er { pr i vat e i nt _i d; Concr et eHandl er 1 ( St r i ng i d) t hr ows Number For mat Except i on { _i d = new I nt eger ( i d) . i nt Val ue( ) ; } Concr et eHandl er 1 ( Handl er ot r o) t hr ows Number For mat Except i on { _i d = new I nt eger ( ot r o. t oSt r i ng( ) ) . i nt Val ue( ) ; } publ i c St r i ng t oSt r i ng( ) { r et ur n new I nt eger ( _i d) . t oSt r i ng( ) ; } publ i c i nt compar eTo ( Handl er ot r o) { r et ur n t oSt r i ng( ) . compar eTo( ot r o. t oSt r i ng( ) ) ; } } cl ass I dent i f i abl e { pr i vat e Handl er _i d; publ i c I dent i f i abl e( St r i ng i d) { _i d = new Concr et eHandl er 1( i d) ; } } Patrn bsico Handler En java j ava. l ang. Compar abl e Implementado por clases de envoltura (I nt eger , Long, etc.), St r i ng, Fi l e, Dat e, publ i c i nt compar eTo ( Obj ect o) t hr ows Cl assCast Except i on Invariantes: sgn( x. compar eTo( y) ) = - sgn( y. compar eTo( x) ) ( x. compar eTo( y) >0 and y. compar eTo( z) >0) x. compar eTo( z) >0 x. compar eTo( y) =0 sgn( x. compar eTo( z) ) =sgn( y. compar eTo( z) ) par a t odo z Consistente con equals: ( x. compar eTo( y) =0) = ( x. equal s( y) )