Академический Документы
Профессиональный Документы
Культура Документы
Patrones de comportamiento
Estado
INTENCION
Permite que un objeto cambie su comportamiento dependiendo de su estado.
El objeto aparentará que cambia de clase.
CONOCIDO COMO
State
MOTIVO
Cuando un objeto puede estar en diferentes estados y el resultado de una
petición a este objeto depende del estado en el que se encuentre, debemos
utilizar este patrón. La idea es introducir una clase abstracta que represente
los distintos estados, para luego hacer subclases. Desde la clase del objeto
se tendrá una referencia a la clase abstracta, a la que se reenviarán las
peticiones recibidas. En el Design Patterns, el ejemplo que se sigue es el de
una conexión TCP.
APLICACIONES
Cuando el comportamiento de un objeto depende de su estado y debe
cambiar este comportamiento en tiempo de ejecución dependiendo de su
estado.
PARTICIPANTES
AppContexto
o Define la interfaz de interés para los clientes
o Mantiene
AppState
o Define una interfaz para encapsular el comportamiento
asociado con un estado particular del contexto.
Ricardo Sosa Sánchez-Cortés – Diseño Orientado a Objetos 2
EstadoConcreto*
o Cada subclase implementa un comportamiento asociado con
un estado del contexto.
COLABORACIONES
Crear y destruir objetos Estado. Hay que elegir entre crear los objetos
Estado cuando se necesiten y destruirlos después, o crearlos con
anterioridad y no destruirlos.
CODIGO DE EJEMPLO
USOS CONOCIDOS
Protocolos TCP.
Herramientas de dibujo.
StateEdit AccesibleState DirStateFactory StateEditable StateFactory
P. RELACIONADOS
El patrón Flyweight explica cuándo y cómo se pueden compartir objetos
Estado
Los estados son habitualmente Singletons.
Ricardo Sosa Sánchez-Cortés – Diseño Orientado a Objetos 4
Observador
INTENCION
Notifica automáticamente de los cambios de estado de un objeto a todos sus
dependientes.
CONOCIDO COMO
Observer
MOTIVO
Un efecto común de particionar un sistema en una colección de clases que
cooperan es la necesidad de mantener la consistencia entre objetos
relacionados sin hacer las clases demasiado dependientes entre sí, ya que
esto reduce su reusabilidad.
El ejemplo del Design Patterns es el de modelo y diferentes vistas.
El patrón Observador describe cómo establecer estas relaciones. Tendríamos
un sujeto y varios observadores. Todos los observadores son notificados
cuando el estado del sujeto cambia.
APLICACIONES
Cuando un sistema requiere que unos elementos sean conscientes de
los cambios producidos en otros.
Cuando la dependencia entre instancias se produce de forma
dinámica, en tiempo de ejecución y no siempre.
Cuando la dependencia se produce de un objeto hacia muchos y un
sistema simple de eventos no sirve porque solo permite notificar a una
sola instancia.
Cuando se quiere que un objeto notifique a otros sin conocer qué tipo
de objetos son.
En ocasiones se implementan sistemas de eventos mediante este
sistema, por ejemplo en el API de Java, de forma que los objetos que
notifican de eventos implementan el interfaz observable y los que reciben
las notificaciones de eventos implementan el interfaz observer. Esto
permite que muchos objetos reciban eventos de otro objeto en lugar de
los sistemas de eventos básicos que solo permiten notificar a un único
objeto.
Ricardo Sosa Sánchez-Cortés – Diseño Orientado a Objetos 5
ESTRUCTURA
PARTICIPANTES
Sujeto (Observable)
o Conoce a sus observadores
o Proporciona una interfaz para añadir y separar objetos
observadores
Observer
o Define un interfaz de actualización para los objetos que deben
ser notificados de los cambios.
SujetoConcreto
o Almacena el estado de interés para los observadores
o Manda una notificación a sus observadores cuando cambia su
estado
ObservadorConcreto
o Mantiene una referencia al sujeto concreto
o Almacena el estado que debe ser consistente con el sujeto
o Implementa el interfaz de actualización de Observer para
mantener su estado consistente con el del sujeto
COLABORACIONES
El sujeto concreto notifica a sus observadores cuando ocurre algún cambio que
podría hacer que el estado de los observadores fuese inconsistente con el
suyo.
Tras ser informados de un cambio en el sujeto concreto, el observador podría
pedir información al sujeto.
CONSECUENCIAS
Acoplamiento abstracto y mínimo entre el sujeto y el observador.
Soporte para comunicación broadcast
Actualizaciones inesperadas. Cada observador no es consciente del
resto de los observadores, se establece una comunicación entre ellos que
no es explícita, por lo tanto no se puede saber qué consecuencias puede
tener cualquier cambio en el sujeto. Además el hecho de que el protocolo
de actualización no indique qué es lo que cambia, agrava este hecho.
IMPLEMENTACIÓN
Generalmente el objeto Observable al notificar al objeto Observer le pasa una
referencia de si mismo como parámetro del método notify (o de alguna otra
Ricardo Sosa Sánchez-Cortés – Diseño Orientado a Objetos 6
CODIGO DE EJEMPLO
USOS CONOCIDOS
MVC (Model/View/Controller) en Smalltalk
Delegación de eventos en Java.
ImageObserver
Observer – Observable.
TileObserver
P. RELACIONADOS
Mediator. Se puede utilizar para coordinar múltiples cambios de
estado de un mismo Observable provocados por diferentes objetos (con
la finalidad de reducir el número de notificaciones) (Manejador de
cambios)
Singleton. El manejador de cambios sería un singleton.
Ricardo Sosa Sánchez-Cortés – Diseño Orientado a Objetos 7
Estrategia
INTENCION
Abstracción para seleccionar un algoritmo de entre una familia de varios.
Permite a los algoritmos variar independientemente de los clientes que lo
usen.
CONOCIDO COMO
Strategy
MOTIVO
Encapsula varios algoritmos alternativos en diferentes clases y se ofrece un
interfaz único (mediante una superclase) para acceder a la funcionalidad
ofrecida, la elección del algoritmo se vuelve transparente para el cliente,
pudiendo depender del objeto e incluso variar en tiempo de ejecución.
PARTICIPANTES
El Cliente delega una operación en la superclase, abstrayéndose de
los detalles de la misma.
Ricardo Sosa Sánchez-Cortés – Diseño Orientado a Objetos 8
CONSECUENCIAS
Las jerarquías de estrategias permiten definir una familia de
algoritmos o comportamientos para que los reutilicen los contextos.
Podríamos hacer algo parecido simplemente heredando y
sobrescribiendo, pero esto acopla en exceso el comportamiento dentro
del contexto. Además no se podría variar el comportamiento en tiempo de
ejecución
El patrón estrategia elimina las sentencias condicionales para
seleccionar el comportamiento deseado.
Puede proporcionar varias implementaciones para el mismo
comportamiento.
Los clientes deben conocer las estrategias y sus diferencias.
Habrá implementaciones que no usen todos los parámetros que
nosotros pasemos al método.
Se incrementa el número de objetos.
IMPLEMENTACIÓN
Hay que definir la interfaz entre contexto y estrategia. Bien el contexto
puede pasar los datos por parámetro, lo que reduce el acoplamiento, pero
podría pasar datos innecesarios; o podría pasarse a sí mismo como
parámetro, de manera que la estrategia le pide lo que necesita, con lo
que se aumenta el acoplamiento.
Se puede hacer la estrategia opcional, proporcionando un
comportamiento por defecto y la posibilidad de usar un objeto estrategia.
si no existe estrategia, se ejecuta el comportamiento por defecto.
CODIGO DE EJEMPLO
En Bruce Eckel ejemplo de encontrar el mínimo de una función.
USOS CONOCIDOS
El paquete java.util.zip en las clases CheckedInputStream y
CheckedOutputStream utiliza la clase Checksum la cual sigue el patrón
Strategy para elegir entre los algoritmos de comprobación de errores en
Streams de bytes ya sea CRC32 o Adler32.
P. RELACIONADOS
Si existen muchas instancias de Cliente es mejor utilizar el patrón Flyweights
en lugar de Strategy.
Ricardo Sosa Sánchez-Cortés – Diseño Orientado a Objetos 9
Template method
INTENCION
Define el esqueleto de un algoritmo en una operación, posponiendo algunos
pasos a las subclases. Permite a las subclases redefinir ciertos pasos de un
algoritmo sin cambiar la estructura del mismo.
CONOCIDO COMO
Template method (método plantilla)
MOTIVO
En el ejemplo de una aplicación framework que trabaja con documentos, el
método abrir documento podría ser un método plantilla que preguntase si se
puede abrir y si es así, que lo añada a la lista de documentos abiertos, lo
abra y lo lea.
Al definir algunos de los pasos de un algoritmo usando métodos abstractos,
el método plantilla fija su orden, pero permite a las subclases variar esas
implementaciones para que se ajusten a sus necesidades.
APLICACIONES
Para implementar la parte invariante de un algoritmo y permitir a las
subclases que implementen la parte que varía.
Cuando el comportamiento común entre las subclases debe ser
factorizado y localizado en una clase común para evitar que se duplique
código.
ESTRUCTURA
PARTICIPANTES
Clase Abstracta define los métodos operación que las subclases
concretas implementarán, e implementa el método plantilla (algoritmo)
con el esqueleto del algoritmo, este método llama a los métodos
abstractos.
Clase Concreta Debe implementar los métodos operación para llevar
a cabo las operaciones específicos de la subclase.
COLABORACIONES
La ClaseConcreta depende de la ClaseAbstracta para implementar los pasos
invariantes del algoritmo.
CONSECUENCIAS
Los métodos plantilla son una técnica fundamental para la reutilización de
código, sobre todo en las bibliotecas de clases, porque factorizan el
comportamiento común.
Ricardo Sosa Sánchez-Cortés – Diseño Orientado a Objetos 10
Este patrón nos lleva a una estructura de control invertida en la que las
superclases llaman a las subclases y no al revés (el principio de Hollywood).
IMPLEMENTACIÓN
Las operaciones primitivas se pueden declara protected, para que sólo
se las pueda llamar desde el método plantilla. El método plantilla se
podría declarar final para que no se pueda sobrescribir.
Hay que minimizar el número de operaciones primitivas.
CODIGO DE EJEMPLO
USOS CONOCIDOS
Los métodos plantilla son tan fundamentales que se pueden encontrar en
casi cualquier clase abstracta
P. RELACIONADOS
El patrón Template Method usa la herencia para variar una parte del
algoritmo. El patrón Strategy usa delegación para variar el algoritmo entero.
Por otro lado se facilita la creación de macros agrupando los comandos más
frecuentes.
CONOCIDO COMO
Command, action, transaction.
MOTIVO
El concepto de "comando" puede ser ambiguo y complejo en los sistemas
actuales y al mismo tiempo muy extendido: intépretes de comandos del sistema
operativo, lenguajes de macros de paquetes ofimáticos, gestores de bases de
datos, protocolos de servidores de Internet, etc.
APLICACIONES
Cuando se requiera:
Facilitar la parametrización de las acciones a realizar.
Independizar el momento de petición del de ejecución.
Implementar CallBacks, especificando que comandos queremos que se
ejecuten en ciertas situaciones de otros comandos. Es decir un
parámetro de un comando puede ser otro comando a ejecutar.
Soportar el "deshacer".
Desarrollar sistemas utilizando comandos de alto nivel que se
construyen con operaciones más sencillas (primitivas).
ESTRUCTURA
Ricardo Sosa Sánchez-Cortés – Diseño Orientado a Objetos 12
PARTICIPANTES
AbstractCommand. Clase que ofrece un interfaz para la ejecución de
comandos. Define los métodos do y undo que se implementarán en cada clase
concreta.
COLABORACIONES
CONSECUENCIAS
Se independiza la parte de la aplicación que invoca los comandos de la
implementación de los mismos.
Al tratarse los comandos como objetos, se puede realizar herencia de
los mismos, composiciones de comandos (mediante el patrón
Composite)
Se facilita la ampliación del conjunto de comandos.
IMPLEMENTACIÓN
Combiene estudiar el conjunto de comandos a implementar y si se observan
comandos demasiado complejos dividirlos en subcomandos más sencillos y
utilizarlos de forma combinada.
Ricardo Sosa Sánchez-Cortés – Diseño Orientado a Objetos 13
CODIGO DE EJEMPLO
USOS CONOCIDOS
Las clases Button y MenuItem de Java facilitan la utilización de este patrón,
declaran los métodos getActionCommand y setActionCommand para dar
nombres a las acciones realizadas por los objetos, facilitandose una
correspondencia entre ambos.
P. RELACIONADOS
Factory Method Ofrece una forma alternativa de llamar a los comandos
además del uso del command manager.
Interprete Se puede imnplementar un pequeño Interprete mediante
clases Command.
Snapshot Puede facilitar el almacenamiento del estado de los objetos
para implementar la acción Deshacer en lugar de utilizar comandos
inversos.
Template Method Puede servir para implementar la lógica de Deshacer
de forma un tanto automática o a alto nivel.
Composite Permite realizar agrupaciones de comandos de forma similar
a una macro.
Prototype Hay quien lo utiliza para implementar la copia del comando al
historico de comandos.