1. Patrón de Diseño
Un patróndescribe unproblemaqueocurre unayotravezennuestroentorno,asícomolasolución
a ese problema, de tal modo que se pueda aplicar esta solución varias veces, y tiene cuatro
elementos esenciales.
Nombre del patrón: Describe un problema de diseño junto con sus soluciones y consecuencias.
Problema: Explica el problema y cuando se debe aplicar el patrón.
Solución:Describe comouna plantilla,lacual se puede aplicar en muchas situaciones diferentes.
Consecuencias: Son los resultados, así como las ventajas e inconvenientes de aplicar el patrón.
Los patrones de diseño no se ocupan de diseños que pueden codificarse en clases y reutilizarse
como tales, sinoque sondescripcionesde clasesyobjetosrelacionadosque están particularizados
para resolver un problema de diseño general en un determinado contexto.
Un patrón de diseño nomina, abstrae e identifica los aspectos clave de una estructura de diseño
común y cada patrón de diseño se centra en un problema concreto.
Patrones de diseño en el MVC
Modelo, Vista, Controlador se usa para construir interfaces de usuario y consiste en tres tipos de
objetos.
Modelo: es el objeto de aplicación.
Vista: es la representación en pantalla.
Controlador: define el modo en que la interfaz reacciona a la entrada del usuario.
MVC desacoplalasvistasde losmodelosyunavistadebe asegurarse de que suaparienciareflejael
estadodel modelo.Cadavezque cambianlosdatosdel modelo,este seencargade avisaralasvistas
que dependen de él.
Cada vista tiene la oportunidad de actualizarse a sí misma, y este enfoque permite asignar varias
vistas a un modelo para ofrecer diferentes presentaciones. El modelo se comunica con sus vistas
cuando cambian sus valores, y las vistas se comunican con el modelo para acceder a estos.
MVC permite vistas anidadas gracias a la clase VistaCompuesta, una subclase de vista. También
permite cambiar el modo en que una vista responde a la entrada de usuario sin cambiar su
representación visual; además encapsula el mecanismo de respuesta en un objeto controlador.
Una vista usa una instancia de una subclase de controlador para implementar una determinada
estrategia de respuesta. Incluso es posible cambiar el controlador de una vista en tiempo de
ejecución, para hacer que la vista cambie el modo en que responde a la entrada de usuario.
Descripción de los patrones de diseño
Cada patrón se divide en secciones para que sean más fáciles de aprender, comparar y usar.
2. Nombre del patrón y clasificación: nombre que pasara a nuestro vocabulario de diseño.
Propósito: Que hace este patrón de diseño y en que se basa.
También conocido como: Otros nombres por los que se conoce el patrón.
Motivación: Como las estructuras de clases y objetos del patrón resuelven el problema.
Aplicabilidad: Situaciones en las que se puede aplicar el patrón de diseño.
Estructura: Representación gráfica de las clases del patrón.
Participantes: Las clases y objetos participantes en el patrón de diseño.
Colaboraciones: como colaboran los participantes para llevar a cabo sus responsabilidades.
Consecuencias: Resultados de usar el patrón.
Implementación: Acciones que se deben tener en cuenta a la hora de aplicar el patrón.
Código de ejemplo: Código que muestra cómo se puede implementar el patrón.
Usos conocidos: Ejemplos del patrón en sistemas reales.
Patrones relacionados: Patrones que están relacionados.
Catálogo de patrones de diseño.
Patrones de diseño con sus propósitos.
Abstract Factory: Proporciona una interfaz para crear familias de objetos relacionados.
Adapter: Permite que cooperen clases, ya que no podrían hacerlo con interfaces incompatibles.
Bridge: Desacopla una abstracción de su implementación.
Builder: Separa la construcción de un objeto complejo de su representación.
Chainof responsibility:Creaunacadenaconlosobjetosreceptoresypasalapeticiónporlamisma.
Command: Encapsula una petición en un objeto, permitiendo llevar un registro.
Composite: Combina objetos en estructuras de árbol para representar jerarquías.
Decorator: Añade dinámicamente nuevas responsabilidades a un objeto.
Facade: Proporciona una interfaz unificada para un conjunto de interfaces de un subsistema.
Factory Method: Permite que una clase delegue en sus subclases la creación de objetos.
Flyweight: Usa el comportamiento para permitir un gran número de objetos de grano fino.
Interpreter: Define una representación de su gramática.
Iterator: Proporciona un modo de acceder secuencialmente a los elementos de un objeto.
Mediator: Define un objeto que encapsula cómo interactúan un conjunto de objetos.
Memento: Guarda el estado interno de un objeto, para poder anular operaciones.
Observer: Define una dependencia de uno a muchos entre objetos.
Prototype: Especifica los tipos de objetos a crear por medio de una instancia prototípica.
Proxy: Proporciona un sustituto o representante de otro objeto para controlar el acceso a este.
Singleton: Garantiza que una clase solo tenga una instancia y acceso global a ella.
State: Un objeto puede modificar su comportamiento cada vez que cambie su estado interno.
Strategy: Define unafamiliade algoritmos,encapsulacadaunode ellosyloshace intercambiables.
Template Method: Permite que las subclases redefinan ciertos pasos del algoritmo.
Visitor: Permite definirunanuevaoperaciónsincambiar las clasesde loselementossobre losque
opera.
3. Organización del Catalogo
Clasificación de los patrones de diseño, los patrones pueden tener un propósito de creación,
estructural o de comportamiento.
Creación: Tienen que ver con el proceso de creación de objetos.
Estructurales: Tratan con la composición de clases u objetos.
Comportamiento: Caracterizan el modo en que las clases y objetos interactúan.
Como resuelven los patrones los problemas de diseño
Los patrones los solucionan de diferentes formas.
Encontrar los objetos apropiados
Los programas orientados a objetos están formados de objetos, un objeto encapsula tanto datos
como los procedimientos que operan sobre esos datos, estos procedimientos se conoce como
métodos u operaciones. Un objeto realiza una operación cuando recibe una petición.
Especificar las interfaces de los objetos
Al conjunto de todas las signaturas definidas por las operaciones de un objeto se le denomina la
interfaz del objeto.
Un tipo es un nombre que se usa para denotar una determinada interfaz, un objeto puede tener
muchos tipos. Parte de la interfaz de un objeto puede ser caracterizada por un tipo.
Las interfacespuedencontenercomosubconjuntos,otrasinterfaces,losobjetossolose conocena
través de su interfaz. Dos objetos con implementaciones diferentes pueden tener interfaces
idénticas.
La asociaciónentiempode ejecuciónentre unapeticiónaunobjetoyuna de sus operacioneseslo
que se conoce como enlace dinámico,yeste nos permite sustituirobjetosentiempode ejecución
por otros que tengan la misma interfaz.
Especificar las implementaciones de los objetos
La implementación de un objeto queda definida por su clase; la clase especifica los datos, la
representación interna del objeto y define las operaciones que puede realizar.
Los objetosse creaninstanciandounaclase,el objetoesunainstanciade laclase yse puedencrear
muchas instancias parecidas de un objeto instanciando una clase. Cuando una subclase hereda de
una clase padre,incluye lasdefinicionesde todoslosdatosyoperacionesquedefine laclase padre.
Una clase abstractaesaquellaque defineunainterfazcomúnparasussubclases,estadelegaraparte
o toda su implementación en las operaciones definidas en sus subclases.
4. Las operaciones que una clase abstracta define pero no implementa se denominan operaciones
abstractas y las clases que no son abstractas se denominan clases concretas.
Herencia de clases frente a herencia de interfaces
La clase de un objetodefinecomose implementaunobjeto,el estadointernoylaimplementación
de sus operaciones.
Un objetopuede tenermuchostipos,yobjetosde clasesdiferentespuedentenerel mismotipo,el
tipo de un objeto solo se refiere a su interfaz.
La herenciade clasesdefine laimplementaciónde unobjetoentérminosde la implementaciónde
otroobjeto,encambiolaherenciade interfacesdescribecuandosepuede usarunobjetoenel lugar
de otro.
Programar para interfaces, no para una implementación
La herenciade clasesnoesmásque unmecanismoparaextenderlafuncionalidadde unaaplicación
reutilizando la funcionalidad de las clases padres, permite definir un nuevo tipo de objetos
basándose en otro y también para definir familias de objetos con interfaces idénticas.
Cuando la herencia se usa correctamente, todas las clases que derivan de una clase abstracta
compartirán su interfaz.
Al manipularlosobjetossolamente entérminosde lainterfazdefinidaporlasclasesabstractas,los
clientes no tienen que conocer los tipos específicos de los objetos que usan.
Poner a funcionar los mecanismos de reutilización
Herencia frente a composición
Las dos técnicasmás comunesparareutilizarfuncionalidadensistemasorientadosaobjetossonla
herencia de clases y la composición de objetos.
La herencia de clases permite definir una implementaciónen términos de otra, a esta forma de
reutilización mediante herencia se la denomina reutilización de caja blanca, que se refiere a
visibilidad porque las clases padres suelen hacerse visibles a las subclases.
La composiciónde objetosesunaalternativaa la herenciade clases,estarequiere que losobjetos
a componertenganinterfacesbiendefinidas,estetipode reutilizaciónse denominareutilizaciónde
caja negra, porque los detalles internos de los objetos no son visibles.
La composiciónde objetosse definedinámicamente entiempode ejecuciónatravésde objetosque
tienenreferenciasaotrosobjetos,ademásrequiere que los objetostenganencuentalasinterfaces
de los otros.
5. Reutilizar mediante la herencia hace más fácil construir nuevos componentes que puedan ser
combinados con los antiguos. La herencia y la composición trabajan por lo tanto juntas.
Delegación
La delegaciónesunmodo de lograr que la composiciónseatan potente parala reutilizacióncomo
lo es la herencia.
La principal ventajade ladelegaciónesque haceque seafácilcombinarcomportamientosentiempo
de ejecución y cambiar la manera en que estos se combinan. La delegación es una buena elección
de diseñosolocuandosimplificamásdeloquecomplicayfuncionamejorcuandoseusaenpatrones
estándar. La delegación es un ejemplo extremo de composición de objetos.
Herencia frente a tipos parametrizados
Tipos parametrizados, es una técnica para reutilizar funcionalidad, también conocidos como
genéricos, esta técnica nos permite definir un tipo sin especificar todos los otros tipos que usa.
Los tipos sin especificar se proporcionan como parámetros cuando se va a usar el tipo
parametrizado.Lostiposparametrizadospermitencambiarlostipos que puede utilizar una clase.
Estructuras que relacionan tiempo de ejecución y tiempo de compilación
La estructura en tiempo de ejecución de un programa orientado a objetos suele guardar poco
parecidoconla estructurade su código.La estructuradel códigose fijaentiempode compilacióny
consiste en clases con relaciones de herencia estáticas.
Distinción entre agregación y asociación.-
Agregación:
- Implica que un objeto posee a otro o que es responsable de él.
- Implica que el objeto agregado y su propietario tienen la misma vida.
- Las relaciones tienden a ser menos y más permanentes que las de asociación.
Asociación:
- Implicaque unobjetosimplemente conoce a otro, denominada también relación de uso.
- Las relacionesse hacenydeshacenmuchomásfrecuentemente yalgunasvecessoloexisten
mientras dura una operación.
6. Diseñar para el cambio
Para maximizar la reutilización reside en anticipar nuevos requisitos y cambios en los requisitos
existentes.Undiseñoquenotengaencuentael cambiosufre el riesgode tenerque serrediseñado
por completo en el futuro.
El rediseño afecta a muchas partes del sistema software, por lo que los cambios no previstos
siempre resultan costosos.
Programas de aplicación
En la construcción de un programa de aplicación, como un editor de documentos o una hoja de
cálculo, la reutilización interna, la facilidad de mantenimiento y la extensión son las principales
prioridades.
Lospatronesde diseñotambiénhacenqueunaaplicaciónseamásfácil de mantenercuandose usan
para limitar las dependencias de plataforma y para organizar un sistema en capas.
Toolkits
Un toolkit es un conjunto de clases relacionadas y reutilizables, una aplicación incorpora clases de
una o más bibliotecas de clases predefinidas llamadas toolkit. Proporcionan funcionalidad que
puede ayudar a que la aplicación haga su trabajo y se centra en la reutilización de código.
Frameworks
Un framework es un conjunto de clases cooperantes que constituyen un diseño reutilizable para
una clase específica de software. El framework determina la arquitectura de nuestra aplicación.
Los patrones y los frameworks son diferentes en que, los patrones de diseño tienen que ser
implementados cada vez que se emplean y los frameworks son el modo en que los sistemas
orientados a objetos consiguen la mayor reutilización.