patrones de diseño: fachada - observador fachada

48
Patrones de Diseño: Fachada - Observador FACHADA

Upload: reynaldo-tellez

Post on 16-Apr-2015

92 views

Category:

Documents


14 download

TRANSCRIPT

Page 1: Patrones de Diseño: Fachada - Observador FACHADA

Patrones de Diseño: Fachada - Observador

FACHADA

Page 2: Patrones de Diseño: Fachada - Observador FACHADA

Patrones de Diseño: Fachada - Observador

INTENCION

El patrón fachada proporciona una interfaz de alto nivel para un subsistema, que oculta las interfaces de bajo nivel de las clases que lo implementan.

Hacer el subsistema más fácil de usar Desacoplar a los clientes de las clases del subsistema.

FACHADAFACHADA

Page 3: Patrones de Diseño: Fachada - Observador FACHADA

Patrones de Diseño: Fachada - Observador

MOTIVACION:MOTIVACION:

Problema: Un cliente trata de utilizar los servicios ofrecidos por un subsistema actuando directamente sobre las interfaces de las clases que lo implementan, esto genera fuertes dependencias hacia muchas de estas interfaces de bajo nivel .

Solución: Aislar a los clientes de las interfaces de bajo nivel del subsistema colocando entre ambos una clase denominada genéricamente “fachada” del subsistema.

FACHADAFACHADA

Page 4: Patrones de Diseño: Fachada - Observador FACHADA

Patrones de Diseño: Fachada - Observador

Clientes utilizando un subsistema antes y después de introducir la fachada

FACHADAFACHADA

Page 5: Patrones de Diseño: Fachada - Observador FACHADA

Patrones de Diseño: Fachada - Observador

APLICACIONES

Necesidad de dotar de una interfaz sencilla y usable a un subsistema complejo.

Se tiene un subsistema que ofrece una funcionalidad muy rica y compleja, y un conjunto significativo de clientes que solo necesitan usar una parte reducida de la misma.

Sólo los clientes que necesiten detalles de más bajo nivel accederán a las clases detrás de la fachada

Necesidad de reducir la dependencia entre las clases que implementan un subsistema y sus clientes.

FACHADAFACHADA

Page 6: Patrones de Diseño: Fachada - Observador FACHADA

Patrones de Diseño: Fachada - Observador

ESTRUCTURA

Estática: Descripción de los participantes y sus responsabilidades.

FACHADAFACHADA

Page 7: Patrones de Diseño: Fachada - Observador FACHADA

Patrones de Diseño: Fachada - Observador

Clases del Subsistema:

Implementan la funcionalidad del subsistema.

Tienen un estrecho conocimiento las unas de las otras y colaboran para llevar a cabo el trabajo asignado por la Fachada.

No conocen de la existencia del objeto Fachada.

ESTRUCTURA

1. Estática1. Estática

FACHADAFACHADA

Page 8: Patrones de Diseño: Fachada - Observador FACHADA

Patrones de Diseño: Fachada - Observador

1. Estática1. Estática

Fachada:

Conoce la distribución de responsabilidades entre las clases del subsistema.

Mantiene referencias hacia muchos de los objetos del subsistema y delega en ellos para llevar a cabo su trabajo.

No tiene conocimiento a cerca de los clientes.

FACHADAFACHADA

Page 9: Patrones de Diseño: Fachada - Observador FACHADA

Patrones de Diseño: Fachada - Observador

1. Estática1. Estática

Clientes

Mantienen una referencia al objeto Fachada. Envían sus mensajes al mismo para

acceder a la funcionalidad del subsistema.

En general no mantienen referencias a los objetos internos del subsistema, pero no

se les impide adquirirlas si lo necesitan.

FACHADAFACHADA

Page 10: Patrones de Diseño: Fachada - Observador FACHADA

Patrones de Diseño: Fachada - Observador

2. Dinámica2. Dinámica

Diagrama de Secuencia – Patrón en funcionamiento

FACHADAFACHADA

Los clientes interaccionan con el subsistema enviando mensajes al objeto Fachada, que los remite a los objetos del subsistema.

Page 11: Patrones de Diseño: Fachada - Observador FACHADA

Patrones de Diseño: Fachada - Observador

El objeto Fachada realiza solamente tareas de traducción.

El objeto Fachada reacciona generando una secuencia de mensajes que pondrá a los objetos internos en colaboración.

Los clientes no accederán a los objetos internos directamente.

2. Dinámica2. Dinámica

FACHADAFACHADA

Page 12: Patrones de Diseño: Fachada - Observador FACHADA

Patrones de Diseño: Fachada - Observador

CONSECUENCIAS

Desde el punto de vista de los Clientes, la fachada los aísla del subsistema minimizando

el número de objetos con los que tiene que tratar para obtener un servicio.

Desde el punto de vista del subsistema el uso de fachadas ayuda a organizar un sistema en capas, ayuda a controlar o eliminar

dependencias entre objetos y permite hacer cambios en los componentes de un subsistema

sin afectar a los clientes.

Oculta parte de la funcionalidad de unsubsistema.

FACHADAFACHADA

Page 13: Patrones de Diseño: Fachada - Observador FACHADA

Patrones de Diseño: Fachada - Observador

IMPLEMENTACIONIMPLEMENTACION

Se puede reducir más el acoplamiento entre los clientes y el subsistema haciendo que la fachada sea una clase abstracta.

Se puede conseguir que la implementación sea independiente del subsistema configurando

la fachada con diferentes objetos del subsistema.

FACHADAFACHADA

Page 14: Patrones de Diseño: Fachada - Observador FACHADA

Patrones de Diseño: Fachada - Observador

Fachada dependiendo de clases abstractas

FACHADAFACHADA

IMPLEMENTACIONIMPLEMENTACION

Page 15: Patrones de Diseño: Fachada - Observador FACHADA

Patrones de Diseño: Fachada - Observador

FACHADAFACHADA

DECORATION.JAVA

public class Decoration { public static String getDecoration() { return "******************"; }} REGULARSCREEM.JAVA

public class RegularScreen { public static void print(String s) { System.out.print(s); } public static void newline() { System.out.println(); }}

IMPLEMENTACION EN JAVAIMPLEMENTACION EN JAVA

Page 16: Patrones de Diseño: Fachada - Observador FACHADA

Patrones de Diseño: Fachada - Observador

FACHADAFACHADA

STRINGTRANSFORMED.JAVA

public class StringTransformer { public static String transformToUpper(String s)

{ return s.toUpperCase(); }

public static String transformToLower(String s) { return s.toLowerCase();

} }

IMPLEMENTACION EN JAVAIMPLEMENTACION EN JAVA

Page 17: Patrones de Diseño: Fachada - Observador FACHADA

Patrones de Diseño: Fachada - Observador

FACHADAFACHADAOUTFACADE.JAVA

public class OutputFacade { public void printNormal(String s) { RegularScreen.print(s); RegularScreen.newline(); } public void printFancy(String s) { RegularScreen.print(Decoration.getDecoration()); RegularScreen.newline(); s = StringTransformer.transformToUpper(s); RegularScreen.print(s); RegularScreen.newline(); RegularScreen.print(Decoration.getDecoration()); RegularScreen.newline(); s = StringTransformer.transformToLower(s); RegularScreen.print(s); RegularScreen.newline(); RegularScreen.print(Decoration.getDecoration()); RegularScreen.newline(); } }

Page 18: Patrones de Diseño: Fachada - Observador FACHADA

Patrones de Diseño: Fachada - Observador

FACHADAFACHADA

MAIN.JAVApublic class Main { public static void main(String[] args) { OutputFacade facade = new OutputFacade(); System.out.println("Testing Facade..."); facade.printNormal("Printing normally works FINE."); facade.printFancy("This is the test for the FANCY output"); }}

Page 19: Patrones de Diseño: Fachada - Observador FACHADA

Patrones de Diseño: Fachada - Observador

FACHADAFACHADA

RESULTADOTesting Facade...Printing normally works FINE.******************THIS IS THE TEST FOR THE FANCY OUTPUT******************this is the test for the fancy output******************

}}

Page 20: Patrones de Diseño: Fachada - Observador FACHADA

Patrones de Diseño: Fachada - Observador

PATRONES RELACIONADOS

Factoría Abstracta: Se puede componer la fachada con una factoría de objetos del subsistema para que cree (y maneje) los objetos a través de una interfaz abstracta, de una forma independiente del subsistema

FACHADAFACHADA

Estructura del patrón Factoría Abstracta en el contexto de uso junto con la fachada

Page 21: Patrones de Diseño: Fachada - Observador FACHADA

Patrones de Diseño: Fachada - Observador

PATRONES RELACIONADOS

AdaptadorUna Fachada y un Adaptador son similares en cuanto que proporcionan una interfaz que se expresa en términos de las interfaces de otras clases. Sin embargo en el patrón Adaptador el énfasis está en adaptar interfaces incompatibles mientras que el patrón Fachada lo pone en simplificar un conjunto de interfaces.

SingletonNormalmente todos los clientes se comunicarán con el subsistema a través de una misma instancia de la Fachada. Por tanto las fachadas son a menudo Singletons.

FACHADAFACHADA

Page 22: Patrones de Diseño: Fachada - Observador FACHADA

OBSERVADOROBSERVADOR

Patrones de Diseño: Fachada - Observador

Page 23: Patrones de Diseño: Fachada - Observador FACHADA

INTENCIÓNINTENCIÓNDefinir una dependencia 1:n de forma que cuando el objeto 1 cambie su estado, los n objetos sean notificados y se actualicen automáticamente

MOTIVACIONMOTIVACIONEn un toolkit de GUI, separar los objetos de presentación (vistas) de los objetos de datos, de forma que se puedan tener varias vistas sincronizadas de los mismos datos (editor-suscriptor).

Patrones de Diseño: Fachada - Observador

OBSERVADOROBSERVADOR

Page 24: Patrones de Diseño: Fachada - Observador FACHADA

En la actualidad es común encontrarnos con aplicaciones que muestran simultáneamente un conjunto de datos de múltiples formas diferentes en el mismo interfaz ( por ejemplo en forma de árbol, tabla, lista, ... ).

El patrón Observer asume que el objeto que contiene los datos es independiente de los objetos que muestran los datos de manera que son estos objetos los que “observan” los cambios en dichos datos :

Patrones de Diseño: Fachada - Observador

OBSERVADOROBSERVADOR

Page 25: Patrones de Diseño: Fachada - Observador FACHADA

Patrones de Diseño: Fachada - Observador

OBSERVADOROBSERVADOR

Page 26: Patrones de Diseño: Fachada - Observador FACHADA

Al implementar el patrón Observer el objeto que posee los datos se conoce como sujeto mientras que cada una de las vistas se conocen como observadores. Cada uno de estos observadores, registra su interés en los datos llamando a un método público del sujeto.

Entonces, cuando estos datos cambian, el sujeto llama a un método conocido de la interfaz de los observadores de modo que estos reciben el mensaje de que los datos han cambiado y actualizan la vista.

Patrones de Diseño: Fachada - Observador

OBSERVADOROBSERVADOR

Page 27: Patrones de Diseño: Fachada - Observador FACHADA

ESTRUCTURAESTRUCTURA

Patrones de Diseño: Fachada - Observador

OBSERVADOROBSERVADOR

Page 28: Patrones de Diseño: Fachada - Observador FACHADA

PARTICIPANTESPARTICIPANTES

Sujeto: Mantiene una lista de observadores y proporciona una interfaz para que se suscriban.

Observador: Define una interfaz para actualizar los objetos que deban ser notificados de cambios en el sujeto

SujetoConcreto: Envía una notificación a sus observadores cuando cambia su estado.

ObservadorConcreto: Mantiene una referencia a un sujeto (SujetoConcreto), almacena parte del estado del sujeto e implementa la interfaz de actualización de Observador para mantener su estado consistente con el del sujeto.

Patrones de Diseño: Fachada - Observador

OBSERVADOROBSERVADOR

Page 29: Patrones de Diseño: Fachada - Observador FACHADA

ESTRUCTURAESTRUCTURA

Patrones de Diseño: Fachada - Observador

OBSERVADOROBSERVADOR

Page 30: Patrones de Diseño: Fachada - Observador FACHADA

COLABORACIONESCOLABORACIONES

SujetoConcreto notifica a sus observadores cuando ocurre un cambio.

Cuando se le informa del cambio, los observadores pueden solicitar información al sujeto para actualizar su estado

Patrones de Diseño: Fachada - Observador

OBSERVADOROBSERVADOR

Page 31: Patrones de Diseño: Fachada - Observador FACHADA

Patrones de Diseño: Fachada - Observador

OBSERVADOROBSERVADORDIAGRAMA DE DIAGRAMA DE INTERACCIONINTERACCION

Page 32: Patrones de Diseño: Fachada - Observador FACHADA

Cuando un cambio en un objeto requiera cambiar otros y no se sepa cuantos objetos necesitan cambiar

Cuando un objeto deba ser capaz de notificar a otros sin conocer su clase concreta, evitando así acoplarlos

Cuando el número de oyentes puede variar durante el ciclo de vida del objeto.

Cuando el bajo acoplamiento es un requerimiento básico del diseño..

APLICABILIDADAPLICABILIDAD

Patrones de Diseño: Fachada - Observador

OBSERVADOROBSERVADOR

Page 33: Patrones de Diseño: Fachada - Observador FACHADA

CARACTERISTICACARACTERISTICASS

El objeto observado no necesita saber nada acerca de los observadores. Son los observadores quienes deben registrarse como 'oyentes' para poder recibir eventos.

Esto permite el desarrollo de aplicaciones con componentes poco acoplados. el bajo acoplamiento se considera una ventaja ya que simplifica la posterior reutilización de componentes.

Los oyentes reciben notificación de todos los eventos generados en los objetos observados. Pueden registrarse en cualquier momento durante el ciclo de vida del componente.

Patrones de Diseño: Fachada - Observador

OBSERVADOROBSERVADOR

Page 34: Patrones de Diseño: Fachada - Observador FACHADA

CONSECUENCIASCONSECUENCIAS

VentajasVentajasPermite reutilizar sujetos y observadores por separado así como añadir nuevos observadores sin modificar el sujeto o los otros observadoresEl acoplamiento abstracto entre el sujeto y el observador ayuda a la división en niveles del sistema

DesventajasDesventajasPuede que cambios pequeños para unos observadores representen grandes cambios en otros, que además pueden tener problemas para detectar qué es lo que ha cambiado

Patrones de Diseño: Fachada - Observador

OBSERVADOROBSERVADOR

Page 35: Patrones de Diseño: Fachada - Observador FACHADA

IMPLEMENTACIOIMPLEMENTACIONN El sujeto puede pasarse a sí mismo como

parámetro en la notificación de los cambios Hay dos opciones según quien dispare la

actualización: Que las operaciones de cambio de estado del

sujeto llamen automáticamente a Notificar Que sean los observadores los que llamen a

Notificar. Las actualizaciones serán más eficientes, pero puede que algún observador se olvide de hacerlo

Cuando el sujeto es destruido los observadores deben ser destruidos o notificados de su destrucción

Hay que asegurarse de que el estado del sujeto es coherente antes de notificar a los observadores

Patrones de Diseño: Fachada - Observador

OBSERVADOROBSERVADOR

Page 36: Patrones de Diseño: Fachada - Observador FACHADA

APLICACIONESAPLICACIONES

En Swing los objetos JList, JTable y JTree actúan como observadores de un modelo de datos De hecho todos los objetos que deriven de JComponent pueden realizar esta separación entre vista y datos, esto se conoce como arquitectura MVC (Modelo-Vista-Controlador), donde los datos son representados por el modelo y la vista por el componente visual. En este caso el controlador es la comunicación entre el modelo y la vista. Por último podemos usar las clases Observer y Observable del paquete java.util.

Patrones de Diseño: Fachada - Observador

OBSERVADOROBSERVADOR

Page 37: Patrones de Diseño: Fachada - Observador FACHADA

EJERCICIOSEJERCICIOS

Describe cómo el Modelo de Delegación de Eventos de Java es una forma especializada del patrón Observer.

¿Cómo es posible implementar el patrón Observer de modo que cada observador pueda indicar que sólo está interesado en ciertos cambios y sólo reciba notificación de ellos?

Patrones de Diseño: Fachada - Observador

OBSERVADOROBSERVADOR

Page 38: Patrones de Diseño: Fachada - Observador FACHADA

IMPLEMENTACIONIMPLEMENTACION

INTERFAZ OBSERVERINTERFAZ OBSERVERAvisa a los observadores de que se ha producido un Avisa a los observadores de que se ha producido un

cambiocambioabstract interface Observerabstract interface Observer {{

public void sendNotify(String s);public void sendNotify(String s);}} INTERFAZ SUBJECTINTERFAZ SUBJECTAvisa al sujeto de los observadores interesadosAvisa al sujeto de los observadores interesadosabstract interface Subjectabstract interface Subject {{

public void registerInterest(Observer obs);public void registerInterest(Observer obs);}}

Page 39: Patrones de Diseño: Fachada - Observador FACHADA

CLASE MiBoton (Sujeto Concreto)CLASE MiBoton (Sujeto Concreto)

public class MiBoton extends JButton public class MiBoton extends JButton implements Subject implements Subject

{{Random r = new Random();Random r = new Random();ArrayList observadores = new ArrayList();ArrayList observadores = new ArrayList();Color c = Color.red;Color c = Color.red;public MiBoton(String nombre)public MiBoton(String nombre) {{

super(nombre);super(nombre);setForeground(c);setForeground(c);

}}

IMPLEMENTACIONIMPLEMENTACION

Page 40: Patrones de Diseño: Fachada - Observador FACHADA

IMPLEMENTACIONIMPLEMENTACION

public void registerInterest(Observer obspublic void registerInterest(Observer obs) ) {{

observadores.add(obs);observadores.add(obs);}}

public void cambiaColor() public void cambiaColor() {{

c = new c = new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255))Color(r.nextInt(255),r.nextInt(255),r.nextInt(255));;

for (int i=0;i<observadores.size();i++) for (int i=0;i<observadores.size();i++) {{((Observer)observadores.get(i)).sendNotify ((Observer)observadores.get(i)).sendNotify ("cambio de color");("cambio de color");}}

}}

Page 41: Patrones de Diseño: Fachada - Observador FACHADA

IMPLEMENTACIONIMPLEMENTACION

public Color getColor()public Color getColor()

{{

return c;return c;

}}

public void registerInterest(Observer obs)public void registerInterest(Observer obs)

{{

observadores.add(obs);observadores.add(obs);

}}

}}

Page 42: Patrones de Diseño: Fachada - Observador FACHADA

IMPLEMENTACIONIMPLEMENTACION

CLASE MiPanel CLASE MiPanel

Implementa la Interfaz OBSERVERImplementa la Interfaz OBSERVER

class MiPanel extends JPanel implements Observerclass MiPanel extends JPanel implements Observer

{{

MiBoton b = null;MiBoton b = null;

public MiPanel(MiBoton b)public MiPanel(MiBoton b)

{{

super();super();

this.b = b;this.b = b;

b.registerInterest(this);b.registerInterest(this);

}}

Page 43: Patrones de Diseño: Fachada - Observador FACHADA

IMPLEMENTACIONIMPLEMENTACION

public void sendNotify(String mensaje) public void sendNotify(String mensaje)

**Método implementado por la interfaz OBSERVER ****Método implementado por la interfaz OBSERVER **

{{

setBackground(b.getColor());setBackground(b.getColor());

}}

}}

Page 44: Patrones de Diseño: Fachada - Observador FACHADA

IMPLEMENTACIONIMPLEMENTACION

CLASE MiFrameCLASE MiFrameImplementa la Interfaz OBSERVERImplementa la Interfaz OBSERVER public class MiFrame extends JFrame public class MiFrame extends JFrame {{

public MiFrame()public MiFrame() {{

final MiBoton b = new MiBoton("Pulsame ya");final MiBoton b = new MiBoton("Pulsame ya");b.addActionListener(new ActionListener() b.addActionListener(new ActionListener() {{

public void public void actionPerformed(ActionEvent e) actionPerformed(ActionEvent e)

{{b.cambiaColor();b.cambiaColor();

}}});});

Page 45: Patrones de Diseño: Fachada - Observador FACHADA

IMPLEMENTACIONIMPLEMENTACION

this.getContentPane().add(b);this.getContentPane().add(b);this.getContentPane().add(new this.getContentPane().add(new MiPanel(b),BorderLayout.NORTH);MiPanel(b),BorderLayout.NORTH);

this.getContentPane().add(new this.getContentPane().add(new MiPanel(b),BorderLayout.SOUTH);MiPanel(b),BorderLayout.SOUTH);

this.getContentPane().add(new this.getContentPane().add(new MiPanel(b),BorderLayout.EAST);MiPanel(b),BorderLayout.EAST);

this.getContentPane().add(new this.getContentPane().add(new MiPanel(b),BorderLayout.WEST);MiPanel(b),BorderLayout.WEST);

setSize(500,400);setSize(500,400);setVisible(true);setVisible(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);;

}}

Page 46: Patrones de Diseño: Fachada - Observador FACHADA

IMPLEMENTACIONIMPLEMENTACION

CLASE PRINCIPALCLASE PRINCIPAL

public static void main(String[ ] args) public static void main(String[ ] args)

{{

new B( );new B( );

}}

}}

Page 47: Patrones de Diseño: Fachada - Observador FACHADA

RESULTADORESULTADO

Al pulsar el Botón, se va a generar un nuevo color aleatorio.El OBSERVER, al ser notificado del cambio, actualiza el color del fondo del JPanel.

Page 48: Patrones de Diseño: Fachada - Observador FACHADA

¿QUÉ PATRON USO?¿QUÉ PATRON USO?

Considerar los problemas de diseñoConsiderar los problemas de diseño Seleccionar los patrones que los resuelvanSeleccionar los patrones que los resuelvan Observar la intención de un patrónObservar la intención de un patrón Escoger los más cercanos al problemaEscoger los más cercanos al problema Estudiar como se interrelacionan los patronesEstudiar como se interrelacionan los patrones Quizás haya que usar más de unoQuizás haya que usar más de uno Estudiar los PDs de propósito similarEstudiar los PDs de propósito similar Comparar posibles solucionesComparar posibles soluciones Estudiar posibles causas de rediseñoEstudiar posibles causas de rediseño Tener en cuenta las que evitan los patronesTener en cuenta las que evitan los patrones Considerar la variabilidad en el diseñoConsiderar la variabilidad en el diseño