jueves, 28 de mayo de 2009

Strategy

Nombre del patrón
Strategy

Clasificación del patrón
De comportamiento.

Intención
Estructurar una familia de algoritmos de modo que sus clientes puedan intercambiarlos en tiempo de ejecución

También conocido como
Policy

Aplicabilidad
Usar este patrón cuando:
  • Muchas clases relacionadas difieren sólo en su comportamiento.

  • Se necesitan distintas variantes del mismo algoritmo.

  • Una clase define muchos comportamientos.

Estructura

Consecuencias
El uso del patrón Strategy tiene las siguientes ventajas y desventajas:
  • Factoriza aspectos comunes de una familia de algoritmos y utilizarlos en las clases base de la jerarquía.
  • Aumenta cohesión del cliente.
  • Sistematiza el uso de implementaciones alternativas.
  • El cliente es el responsable de crear estrategias, por tanto debe comprender las posibilidades que ofrecen, esto es, debe ser relevante para el contexto del cliente.
  • Menor eficiencia. Aumenta el número de objetos creados.

Implementación

  • Conviene analizar si es posible encapsular comportamiento común a todas las estrategias en una superclase.
  • El cliente puede pasar la información necesaria al algoritmo o bien pasarse asimismo.
  • El cliente puede evitar la creación innecesaria de objetos cuando la estrategia solicitada es idéntica a la última

Patrones relacionados
TemplateMethod.
Una intención similar pero haciendo uso de la herencia en lugar de delegación

Referencias Bibliográficas
Design Patterns Elements of Reusable Object-Oriented Software, GoF.
http://www.lsi.us.es/docencia/get.php?id=1378

State


Nombre del patrón
State

Clasificación del patrón
De comportamiento.

También conocido como
Objetcs for States.

Motivación
Permite que un objeto modifique su comportamiento cada vez que cambie su estado interno. Parecerá que cambia la clase del objeto.

Aplicabilidad
· Aplicaciones cuyos componentes cambian de estado de forma dinámica durante su ejecución.
· Aplicaciones con grandes condicionales dependientes del estado de un objeto.

Estructura

Participantes
Context
Define interfaz y mantiene una instancia con el estado actual
State
Define interfaz para el comportamiento asociado a un determinado estado del Contexto.
Subclases Concrete State
Cada subclase implementa el comportamiento asociado con un estado del contexto.

Consecuencias
Localiza el comportamiento dependiente del estado y divide dicho comportamiento en diferentes estados. Las transiciones entre estados no residen en sentencias if o swtich monolíticas, sino que se reparte entre las subclases.
Hace explícitas las transiciones entre estados. Introducir objetos separados para los diferentes estados hace que las transiciones sean más explícitas.
Los objetos Estado pueden compartirse.

Implementación
Al momento de implementar el patrón State debemos tener en cuenta:

  • No queda claro quien define las transiciones entre estados.
  • Una alternativa basada en tablas.
  • Crear y destruir objetos estados.
  • Usar herencia dinámica (sólo permitido en algunos lenguajes de programación (self) )

Usos Conocidos

Conexión TCP. Clase abstracta “Estado TCP” y derivan los diferentes estados de la conexión.
Herramientas de dibujo. Clase abstracta “herramienta” y derivan los diferentes tipos de herramientas.

Patrones relacionados
Flyweight
Singleton


Referencias Bibliográficas
Design Patterns Elements of Reusable Object-Oriented Software, GoF.
http://dmi.uib.es/~yuhua/APOO07-08/Presentation/Bridge-State.pdf
http://kybele.escet.urjc.es/documentos/SI/Patrones/20_State.ppt
http://www.ldc.usb.ve/~mgoncalves/IS2/sd07/grupo3.pdf

martes, 26 de mayo de 2009

Observer

Nombre del patrón
Observer

Clasificación del patrón
De comportamiento

Intención
Definir una dependencia de uno-a-muchos entre objetos, de manera que cuando un objeto cambia de estado todos los que dependan de él sean notificados y actualizados automáticamente.

También conocido como
Dependents, Publish-Subscribe

Motivación
Un efecto secundario común en un sistema particionado en una colección de clases que cooperan es la necesidad de mantener la coherencia entre los objetos relacionados. No se desea lograr la coherencia, haciendo clases estrechamente unidas ya que esto reduce la reutilización.
El patrón Observer describe como estableces las relaciones entre las clases. Los objetos claves en este patrón son el sujeto y el observador. Un sujeto puede tener cualquier número de observadores dependientes. Todos los observadores son notificados cuando el sujeto se somete a un cambio de estado. Como respuesta, cada observador consulta el sujeto pata sincronizar este estado con los estados de los demás sujetos.

Aplicabilidad
Aplicamos el patrón Observer cuando se tenemos alguna de estas situaciones:
  • Cuando una abstracción tiene dos aspectos, uno depende del otro. Encapsular estos aspectos en objetos separados permitirá variarlos y reutilizarlos de forma independiente.
  • Cuando un cambio en un objeto requiere cambiar otros, y no se conoce cuantos objetos necesitan ese cambio.
  • Cuando un objeto debe ser capaz de notificar a otros objetos sin suponer acerca de que son esos objetos. En otras palabras, no se quiere que los objetos estén perfectamente acoplados.

Estructura


Participantes

Subject

  • Conoce a sus observadores. Cualquier número de objetos Observer pueden observar un subject.
  • Provee una interfaz para conectar y desconectar objetos Observer.

Observer

Define una interfaz actualizada para objetos que deben ser notificados de los cambios en un sujeto (subject)

ConcreteSubject

  • Almacena el estado de los objetos ConcreteObserver interesados.
  • Envía una notificación a sus observadores cuando su estado cambia.

ConcreteObserver

  • Mantiene una referencia a un objeto ConcreteSubject.
  • Almacena el estado que debe mantener consistencia con el sujeto.
  • Implementa la interfaz actualizada de Observer para mantener su estando en concordancia con el del sujeto.

Colaboraciones

  • El objeto observado notifica a sus observadores cada vez que ocurre un cambio, con la finalidad de que el estado de ambos sea consistente.
  • Después de ser informado de un cambio en el objeto observado, cada observador concreto puede pedirle la información que necesita para reconciliar su estado con el de aquél.

Consecuencias
EL patrón Observer permite variar los sujetos y los observadores independientemente. Se puede rehusar sujetos sin el rehúso de observadores y viceversa. Permite agregar observadores sin modificar el sujeto o los observadores.
Algunas ventajas y desventajas del patrón Observer son:

  1. Acoplamiento abstracto entre Subject y Observer. Todo lo que un objeto sabe de sus observadores es que tiene una lista de objetos que satisfacen la interfaz Observer. Con lo que podrían incluso pertenecer a dos capas distintas de la arquitectura de la aplicación.
  2. No se especifica el receptor de una actualización. Se envía a todos los objetos interesados
  3. Actualizaciones inesperadas. Se podrían producir actualizaciones en cascada muy ineficientes.

Implementación
Varias cuestiones relacionadas con los mecanismos de dependencias son discutidas a la hora de implementar el patrón Observer:

  1. Correspondencia entre objetos observados y observadores. En vez de mantener una colección con referencias explícitas a los observadores en el objeto observado, sería posible hacerlo con una tabla hash que relacionase ambos. Útil cuando hay muchos objetos a observar y pocos observadores, para reducir los costes de Almacenamiento.
  2. Observar más de un objeto. Cuando un observador dependa de más de un objeto, es necesario ampliar la información de la operación update. Por ejemplo, incluyéndose el objeto observado a sí mismo como parámetro, para que el observador pueda discriminar.
  3. ¿Quién lanza la actualización? Es decir, ¿quién se encarga de llamar a notify? El objeto observado, cada vez que cambia su estado, puede dar lugar a actualizaciones ineficientes, Los clientes puede eliminar actualizaciones intermedias innecesarias, más propenso a errores: los clientes pueden olvidarse de llamar a notify.
  4. Evitar protocolos de actualización específicos de los observadores. Modelo push: El objeto observado envía información detallada a sus observadores sobre el cambio producido, (La necesiten o no). Modelo pull: Tan sólo avisa de que cambió, Los observadores le solicitan la información que necesiten.
  5. Especificar explícitamente el aspecto que varía. Podemos extender la interfaz de registro de observadores para que éstos indiquen los eventos que les interesan. Cuando se produzca un evento, el objeto observado informará sólo a los observadores interesados en ese evento.

Usos Conocidos

  • Uno de los primeros usos conocidos del patrón Observer aparece en Smalltalk Model/View/Controller.
  • Delegación de eventos en Java.

Patrones relacionados
Mediator.
Para encapsular actualizaciones semánticas complejas, el ChangeManager actúa como mediador entre sujetos y observadores.
Singleton. El ChangeManager puede usar el patrón Singleton para que sea único y accesible a nivel global.

Referencias Bibliográficas
Design Patterns Elements of Reusable Object-Oriented Software, GoF.
http://kybele.escet.urjc.es/documentos/SI/Patrones/16_Observer.ppt
http://sophia.javeriana.edu.co/~lcdiaz/ingSw2006-3/ptnObserver_dAli.ppt
http://www.cesaracebal.com/docencia/asignaturas/aaswiki/_media/patrones/observer-mvc.pdf?id=patrones%3Amvc&cache=cache