32 Fachada Aplicabilidad Proporcionar una interfaz simple a un subsistema. Hay muchas dependencias entre clientes y las clases que implementan una abstracción. Se desea una arquitectura de varios niveles: una fachada define el punto de entrada para cada nivel-subsistema.
33 Fachada Consecuencias Una fachada ofrece los siguientes beneficios:
Facilita a los clientes el uso de un subsistema, al ocultar sus componentes. Proporciona un acoplamiento débil entre un subsistema y los clientes: cambios en los componentes no afectan a los clientes. No se impide a los clientes el uso de las clases del subsistema si lo necesitan.
34 Fachada Implementación Es posible reducir el acoplamiento entre clientes y subsistema, definiendo la fachada como una clase abstracta con una subclase por cada implementación del subsistema. La fachada no es la única parte pública de un subsistema, sino que es posible declarar clases individuales del subsistema como públicas (paquetes en Java, name space en C++).
35 Flyweight (Peso Ligero) Propósito Uso de objetos compartidos para soportar eficientemente un gran número de objetos de poco tamaño. Motivación En una aplicación editor de documentos, ¿modelamos los caracteres mediante una clase? Un flyweight es un objeto compartido que puede ser utilizado en diferentes contextos simultáneamente. No hace asunciones sobre el contexto Estado intrínseco vs. Estado extrínseco
36 Flyweight Estado intrínseco se almacena en el flyweight y consiste de información que es independiente del contexto y se puede compartir. Estado extrínseco depende del contexto y por tanto no puede ser compartido. Objetos clientes son responsables de pasar el estado extrínseco al flyweight cuando lo necesita. Objetos flyweight se usan para modelar conceptos o entidades de los que se necesita una gran cantidad en una aplicación, p.e. caracteres de un texto.
37 Flyweight Flyweight getFlyweight (key) { if “existe (flyweight[key])” { return “flyweight existente”} else { “crear nuevo flyweight”; “añadirlo al conjunto de flyweights”; return “nuevo flyweight”} }
38 Flyweight Aplicabilidad Aplicarlo siempre que se cumplan las siguientes condiciones:
Una aplicación utiliza un gran número de cierto tipo de objetos. El coste de almacenamiento es alto debido al excesivo número de objetos. La mayor parte del estado de esos objetos puede hacerse extrínseco. Al separar el estado extrínseco, muchos grupos de objetos pueden reemplazarse por unos pocos objetos compartidos. La aplicación no depende de la identidad de los objetos.
39 Flyweight Consecuencias Puede introducir costes run-time debido a la necesidad de calcular y transferir el estado extrínseco. La ganancia en espacio depende de varios factores: la reducción en el número de instancias el tamaño del estado intrínseco por objeto si el estado extrínseco es calculado o almacenado Interesa un estado extrínseco calculado Se suele combinar con el Composite.
40 Flyweight Implementación La aplicabilidad depende de la facilidad de obtener el estado extrínseco. Idealmente debe poder calcularse a partir de una estructura de objetos que necesite poco espacio de memoria. Debido a que los flyweight son compartidos, no deberían ser instanciados directamente por los clientes: clase FlyweightFactory.
41 Código del Ejemplo public class Elemento { public Elemento() {..} public void mostrar (Window w, ElemContexto ec) {..} public void setFont (Font f, ElemContexto ec) {..} public Font getFont (ElemContexto ec) {..} public void insert (ElemContexto ec, Elemento e) {..} … } public class Caracter extends Elemento { char code; public Caracter(char c) {..} public void mostrar (Window w, ElemContexto ec) {..} }
42 Código del Ejemplo public class ElemContexto { int index; Btree fonts;
public ElemContexto() {…} public void setFont (Font f, int span) {..} public Font getFont () {..} public void insert (int cant) {..} public void next (){..} }
43 Ejemplos en Java Strings Pool de objetos compartidos para literales de tipo String “hola” = “hola” Método intern() en clase String: dado un string lo añade al pool String c = (a+b).intern Bordes de Swing class BorderFactory { public static Border createLineBorder(); public static Border createCompoundBorder() … }
JPanel pane = new Jpanel pane.setBorder(Borderfactory.createBorderLine(Color.black))
44 Proxy (Sustituto) Propósito Proporcionar un sustituto (surrogate) de un objeto para controlar el acceso a dicho objeto. Motivación Diferir el coste de crear un objeto hasta que sea necesario usarlo: creación bajo demanda. Un editor de documentos que incluyen objetos gráficos. ¿Cómo ocultamos que una imagen se creará cuando se necesite?: manejar el documento requiere conocer información sobre la imagen.
45 Proxy Motivación Hay situaciones en las que un cliente no referencia o no puede referenciar a un objeto directamente, pero necesita interactuar con él. Un objeto proxy puede actuar como intermediario entre el objeto cliente y el objeto destino. El objeto proxy tiene la misma interfaz como el objeto destino. El objeto proxy mantiene una referencia al objeto destino y puede pasarle a él los mensajes recibidos (delegación).
46 Estructura Proxy
47 Proxy Motivación Retrasar la operación de una clonación de una tabla hasta conocer que es realmente necesaria. Se desea clonar la tabla para evitar mantener un bloqueo un largo período de tiempo: operación costosa. Se puede crear una clase que encapsule la tabla y sólo clone cuando sea necesario. Mantenimiento de los servicios ante los fallos. Materialización perezosa de tuplas en objetos.
(Ver fotocopias entregadas)
48 Proxy Aplicabilidad Siempre que hay necesidad de referenciar a un objeto mediante una referencia más rica que un puntero o una referencia normal. Situaciones comunes;
Proxy acceso remoto (acceso a un objeto en otro espacio de direcciones) Proxy virtual (crea objetos grandes bajo demanda) Proxy para protección (controlar acceso a un objeto) Referencia inteligente (smart reference, proporciona operaciones adicionales)
49 Proxy Consecuencias Introduce un nivel de indirección para:
Un proxy remoto oculta el hecho que objetos residen en diferentes espacios de direcciones. Un proxy virtual tales como crear o copiar un objeto bajo demanda. Un proxy para protección o las referencias inteligentes permiten realizar tareas de control sobre los objetos accedidos.
50 Proxy Ejercicio 1. Se tiene una gran colección de objetos, tal como una tabla hash, y debe permitirse el acceso concurrente de diferentes clientes. Uno de los clientes desea realizar varias operaciones de búsqueda consecutivas, no permitiéndose el acceso a otros clientes para añadir o eliminar elementos de la colección.
Ejercicio 2. Un servidor tiene varias utilidades que se ejecutan como daemons sobre algunos puertos. ¿Cómo puede conseguirse acceder a estos servicios como si fuesen objetos locales desde varias máquinas cliente?
Página anterior | Volver al principio del trabajo | Página siguiente |