Ingenieria del Software IV Patrones de diseo Marina

  • Slides: 57
Download presentation
Ingenieria del Software IV Patrones de diseño Marina Saiz Felix

Ingenieria del Software IV Patrones de diseño Marina Saiz Felix

Patrones de diseño Contenido n n n Introducción Patrones de diseño más importantes n

Patrones de diseño Contenido n n n Introducción Patrones de diseño más importantes n Visión general: n Clasificación n Descripción n Ejemplo de uso de patrones en la implementación del lenguaje n Visión concreta: Patrón Proxy n Aplicación: Dynamic Proxies (Java y C#) n Otros patrones Conclusiones

Patrones de diseño Introducción n Objetivo: n Reutilización del conocimiento: n n Cada patrón

Patrones de diseño Introducción n Objetivo: n Reutilización del conocimiento: n n Cada patrón describe un problema que ocurre una y otra vez en nuestro entorno y describe también el núcleo de la solución al problema, de forma que puede utilizarse un millón de veces sin tener que hacer dos veces lo mismo” [Alexander] Definición: n Un patrón es una solución a un problema general que puede adaptarse a un problema concreto

Patrones de diseño Introducción n Clasificación: Patrones de Creación Abstract Factory Builder Factory Method

Patrones de diseño Introducción n Clasificación: Patrones de Creación Abstract Factory Builder Factory Method Prototype Singleton Patrones estructurales Adapter Bridge Composite Decorator Facade Flyweight Proxy Patrones de Comportamiento Chain of Responsibility Command Interpreter Iterator Mediator Memento Observer State Strategy Template Method Visitor

Patrones de diseño Introducción n Clasificación: n n n Patrones de creación: relativo a

Patrones de diseño Introducción n Clasificación: n n n Patrones de creación: relativo a la creación de objetos Patrones de comportamiento: caracteriza la forma en que clases y objetos interactúan y la distribución de responsabilidades Patrones estructurales: trata de la composición de clases u objetos

Patrones de diseño De Creación n Factory Method: n n Definición: define un interfaz

Patrones de diseño De Creación n Factory Method: n n Definición: define un interfaz para crear un objeto, pero deja que las subclases decidan qué clase instanciar. Este patrón delega la instanciación de una clase a sus subclases Aplicación en. NET (FCL) n n n System. Collections. IEnumerable System. Net. Web. Request System. Security. Cryptography System. Security. Policy: IIdentity. Permission. Factory ASP. NET HTTP Pipeline

Patrones de diseño De Creación n Singleton: n n Definición: asegura que una clase

Patrones de diseño De Creación n Singleton: n n Definición: asegura que una clase sólo tendrá una instancia, y provee un punto global de acceso a la misma. Aplicación en Java n La clase java. lang. Runtime del API de Java es una clase Singleton, no tiene constructores públicos y se obtiene su única instancia llamando a get. Runtime()

Patrones de diseño Introducción n Clasificación: n n n Patrones de creación: relativo a

Patrones de diseño Introducción n Clasificación: n n n Patrones de creación: relativo a la creación de objetos Patrones de comportamiento: caracteriza la forma en que clases y objetos interactúan y la distribución de responsabilidades Patrones estructurales: trata de la composición de clases u objetos

Patrones de diseño De comportamiento n Command n Definición: Encapsula una petición como un

Patrones de diseño De comportamiento n Command n Definición: Encapsula una petición como un objeto, esto n Aplicación facilita la parametrización de los requerimientos , el encolado de multiples peticiones y su reordenación, y permite implementar el hacer/deshacer mediante métodos. n Java n n Las clases Button y Menu. Item de Java facilitan la utilización de este patrón, declaran los métodos get. Action. Command y set. Action. Command para dar nombres a las acciones realizadas por los objetos, facilitándose una correspondencia entre ambos. . NET: n System. Events. Args

Patrones de diseño De comportamiento n Iterator n n Definición: Permite acceder secuencialmente a

Patrones de diseño De comportamiento n Iterator n n Definición: Permite acceder secuencialmente a los elementos de estructura de datos u objetos preservando su estructura interna. Aplicación en Java n Las clases Collection del paquete java. utilizan el patrón Iterator.

Patrones de diseño De comportamiento n Mediator n n Definición: Define un objeto que

Patrones de diseño De comportamiento n Mediator n n Definición: Define un objeto que encapsula cómo interactúan un conjunto de objetos. Promueve un bajo acoplamiento al evitar que los objetos se refieran unos a otros explícitamente, y permite variar la interacción entre ellos de forma independiente. Aplicación en Java's AWT usa el patrón mediator en la implementación de la java. awt. Dialog class.

Patrones de diseño De comportamiento n Observer n n Definición: Notifica automáticamente de los

Patrones de diseño De comportamiento n Observer n n Definición: Notifica automáticamente de los cambios de estado de un objeto a todos sus dependientes. Permite de forma dinámica implementar dependencias entre objetos, de forma que los objetos dependientes sean notificados de los cambios que se producen en los objetos de los que dependen. Aplicaciones n Java n n C# n Delegación de eventos en Java. Events & Delegates

Patrones de diseño De comportamiento n State n n Definición: Modelo para que un

Patrones de diseño De comportamiento n State n n Definición: Modelo para que un objeto cambie su comportamiento dependiendo de su estado, pudiendo incluso aparentar que cambia de clase. Usos: n State. Edit Accesible. State Dir. State. Factory State. Editable State. Factory

Patrones de diseño De comportamiento n Template Method n n Encapsula un algoritmo en

Patrones de diseño De comportamiento n Template Method n n Encapsula un algoritmo en una clase abstracta de forma que puede ser reutilizada. Definición: Aplicación n Es muy frecuente su utilización en algoritmos genéricos de ordenación y búsqueda. n En la plataforma. NET se utiliza un patrón template para implementar una forma génerica de gestión de eventos.

Patrones de diseño Introducción n Clasificación: n n n Patrones de creación: relativo a

Patrones de diseño Introducción n Clasificación: n n n Patrones de creación: relativo a la creación de objetos Patrones de comportamiento: caracteriza la forma en que clases y objetos interactúan y la distribución de responsabilidades Patrones estructurales: trata de la composición de clases u objetos

Patrones de diseño Estructurales n Adapter n n Definición: Convierte la interfaz de una

Patrones de diseño Estructurales n Adapter n n Definición: Convierte la interfaz de una clase en otra más compatible con nuestras necesidades. Aplicación: n Java n n Window. Adapter class . NET n System. XML namespace

Patrones de diseño Estructurales n Composite n Definición: permite construir objetos complejos componiendo de

Patrones de diseño Estructurales n Composite n Definición: permite construir objetos complejos componiendo de forma recursiva objetos similares en una estructura de árbol. Permite manipular todos los objetos contenidos en el árbol de forma uniforme, ya que todos ellos poseen una interfaz común definida en la clase raíz. n Aplicación en Java: n Paquete java. awt

Patrones de diseño Estructurales

Patrones de diseño Estructurales

Patrones de diseño Estructurales n Decorator n n Definición: Añadir nuevas responsabilidades dinámicamente a

Patrones de diseño Estructurales n Decorator n n Definición: Añadir nuevas responsabilidades dinámicamente a un objeto, es una alternativa a crear demasiadas subclases por herencia. Aplicación en Java n java. io classes : manejo de streams

Patrones de diseño Estructurales n Facade n n Definición: Simplifica el acceso a un

Patrones de diseño Estructurales n Facade n n Definición: Simplifica el acceso a un conjunto de clases o interfaces. Reduce la dependencia entre clases ofreciendo un punto de acceso al resto de clases Aplicación: n n Java : interface JDBC C #: interface ADO. NET

Patrones de diseño Estructurales n Proxy n Definición: proporciona un sustituto o representante de

Patrones de diseño Estructurales n Proxy n Definición: proporciona un sustituto o representante de otro objeto para controlar el acceso a éste.

Estudio Concreto: Patrón PROXY JAVA public interface Subject { public void request(); } public

Estudio Concreto: Patrón PROXY JAVA public interface Subject { public void request(); } public class Real. Subject implements Subject { public void request() { System. out. println("Real. Subject. request() executing"); } } C# abstract class Subject { abstract public void Request(); } class Real. Subject : Subject{ override public void Request(){ Console. Write. Line("Called Real. Subject. Request()"); } }

Estudio Concreto: Patrón PROXY JAVA public class Proxy implements Subject { private Real. Subject

Estudio Concreto: Patrón PROXY JAVA public class Proxy implements Subject { private Real. Subject rs = new Real. Subject(); public void request() { rs. request(); } } public class Client { public static void main(String[] args) { // create subject proxy Subject s = new Proxy(); // call request through proxy s. request(); } } C# class Proxy : Subject{ Real. Subject real. Subject; override public void Request(){ if( real. Subject == null ) real. Subject = new Real. Subject(); real. Subject. Request(); } public class Client{ public static void Main( string[] args ){ // Create proxy and request a service Proxy p = new Proxy(); p. Request(); } }

Estudio Concreto: Patrón PROXY n Actúan como intermediarios entre el objeto cliente y el

Estudio Concreto: Patrón PROXY n Actúan como intermediarios entre el objeto cliente y el objeto deseado n Motivación: n n n En ocasiones se desea retrasar la instanciación de un objeto hasta que sea necesario utilizarlo. Así el objeto proxy lo sustituye ofreciendo la misma interfaz, solo cuando es necesario le solicita al objeto real la información que necesita. Otro motivo para su uso es sustituir a un sistema remoto, de forma que se accede al mismo a través de una clase proxy, que permite controlar el acceso Aplicación n Java : Proxy Class del API Dynamic Proxies

Estudio Concreto: Patrón PROXY: Ejemplo sin utilizar Proxy Suponer que tenemos la interfaz IVehicle:

Estudio Concreto: Patrón PROXY: Ejemplo sin utilizar Proxy Suponer que tenemos la interfaz IVehicle: /** * Interface IVehicle. */ public interface IVehicle { public void start(); public void stop(); public void forward(); public void reverse(); public String get. Name(); }

Estudio Concreto: Patrón PROXY: Ejemplo sin utilizar Proxy Y una clase Car que implementa

Estudio Concreto: Patrón PROXY: Ejemplo sin utilizar Proxy Y una clase Car que implementa la IVehicle interface: /* Class Car*/ public class Car implements IVehicle { private String name; public Car(String name) {this. name = name; } public void start() { System. out. println("Car " + name + " started"); } // stop(), forward(), reverse() implemented similarly. // get. Name() not shown. }

Estudio Concreto: Patrón PROXY: Ejemplo sin utilizar Proxy /*Class Client 1. Interacts with a

Estudio Concreto: Patrón PROXY: Ejemplo sin utilizar Proxy /*Class Client 1. Interacts with a Car Vehicle directly. */ public class Client 1 { public static void main(String[] args) { IVehicle v = new Car("Botar"); v. start(); v. forward(); v. stop(); } }

Estudio Concreto: Patrón PROXY: Ejemplo n n No Proxy: El Cliente interactúa directamente con

Estudio Concreto: Patrón PROXY: Ejemplo n n No Proxy: El Cliente interactúa directamente con los métodos definidos en la interface Proxy: se encuentra entre la interfaz y la implementación e intercepta las llamadas a los métodos. La inteción del proxy es controlar el acceso al objeto deseado, además de mejorar la funcionalidad del mismo.

Estudio Concreto: Patrón PROXY: Ejemplo utilizando Proxy /* Class Vehicle. Proxy*/ public class Vehicle.

Estudio Concreto: Patrón PROXY: Ejemplo utilizando Proxy /* Class Vehicle. Proxy*/ public class Vehicle. Proxy implements IVehicle { private IVehicle v; public Vehicle. Proxy(IVehicle v) {this. v = v; } public void start() { System. out. println("Vehicle. Proxy: Begin of start()"); v. start(); System. out. println("Vehicle. Proxy: End of start()"); } // stop(), forward(), reverse() implemented similarly. // get. Name() not shown. }

Estudio Concreto: Patrón PROXY: Ejemplo utilizando Proxy /* Class Client 2. Interacts with a

Estudio Concreto: Patrón PROXY: Ejemplo utilizando Proxy /* Class Client 2. Interacts with a Car Vehicle through a Vehicle. Proxy. */ public class Client 2 { public static void main(String[] args) { IVehicle c = new Car("Botar"); IVehicle v = new Vehicle. Proxy(c); v. start(); v. forward(); v. stop(); }}

Estudio Concreto: Patrón PROXY: Ejemplo n n Esta implementación supone una clase proxy por

Estudio Concreto: Patrón PROXY: Ejemplo n n Esta implementación supone una clase proxy por cada par interface/implementation además de que cada método debe codificarse por separado. Una mejor versión del proxy se puede implementar usando el package ava. lang. reflect. Para llevar a cabo este propósito se usa la clase java. lang. reflect. Proxy junto con la interface java. lang. reflect. Invocation. Handler.

Estudio Concreto: Dynamic Proxies en Java n n Una dynamic proxy class es una

Estudio Concreto: Dynamic Proxies en Java n n Una dynamic proxy class es una clase que implementa una lista de interfaces especificadas en tiempo de ejecución cuando se crea la clase. La clase proxy implementa exactamente las interfaces especificadas en su creación Una dynamic proxy se implementa usando los métodos estáticos que proporciona la clase java. lang. reflect. Proxy y la interface java. lang. reflect. Invocation. Handler Cada instancia de la clase tiene asociada un invocation handler object que implementa la interface Invocation. Handler

Estudio Concreto: Dynamic Proxies en Java: Pasos 1. Creation of a Proxy Class n

Estudio Concreto: Dynamic Proxies en Java: Pasos 1. Creation of a Proxy Class n n n Para crear la clase proxy necesitamos el método estático get. Proxy. Class() de la clase Proxy El resultado de la llamada a este método es una clase objeto que extiende la Proxy Class e implementa todas las interfaces que se le pasan. Con esto ya tenemos una clase que representa el proxy 2. Creation of a Proxy Instance La Proxy class puede ser instanciada a través de el método estático new. Proxy. Instance que tiene como argumentos la Class. Loader bajo la cual se ha definido el proxy, un array de interfaces (passed as an array of java. lang. Class) y una instancia de la Invocation. Handler interface. n public static Object new. Proxy. Instance(Class. Loader loader, Class[] interfaces, Invocation. Handler ih) throws Illegal. Argument. Exception Returns a reference to the proxy instance.

Estudio Concreto: Dynamic Proxies en Java: Pasos 3. Method Invocation on a Proxy Instance

Estudio Concreto: Dynamic Proxies en Java: Pasos 3. Method Invocation on a Proxy Instance n Cuando un método es invocado en una instancia de la clase proxy, el método es codificado y remitido al método invoke de su invocation handler. n public Object invoke(Object proxy, Method method, Object[] args) throws Throwable n n The proxy instance itself. A Method object corresponding to the method invocation to be made on the proxy instance. The declaring class of this Method object will be the interface implemented by the proxy instance. An array of objects containing the arguments of the method invocation. El valor que retorna el método invoke() será el valor que retorne la instancia del proxy.

Estudio Concreto: Dynamic Proxies en Java: Ejemplo genérico public class Dynamic. Proxy implements Invocation.

Estudio Concreto: Dynamic Proxies en Java: Ejemplo genérico public class Dynamic. Proxy implements Invocation. Handler{ private Object target = null; public static Object new. Instance(Object target){ Class target. Class = target. Class(); Class interfaces[] = target. Interfaces(); return Proxy. new. Proxy. Instance(target. Class. Loader(), interfaces, new Dynamic. Proxy(target)); } private Dynamic. Proxy(Object target) { this. target = target; }

Estudio Concreto: Dynamic Proxies en Java public Object invoke(Object proxy, Method method, Object[] args)

Estudio Concreto: Dynamic Proxies en Java public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{ Object invocation. Result = null; try { System. out. println("Before method " + method. get. Name(); invocation. Result = method. invoke(this. target, args); System. out. println("After method " + method. get. Name(); } catch(Invocation. Target. Exception ite) { //this is the exception thrown by the method being invoked //we just rethrow the wrapped exception to conform to the interface throw ite. get. Target. Exception(); } catch(Exception e) { System. err. println("Invocation of " + method. get. Name() + " failed"); System. err. println(e. get. Mesage()); } finally{ return invocation. Result; }}}

Estudio Concreto: Dynamic Proxies en Java n Usar el dynamic proxy es trivial, solamente

Estudio Concreto: Dynamic Proxies en Java n Usar el dynamic proxy es trivial, solamente requiere utilizar el método new. Instance cada vez que se desee instanciar una implementación tal y como se muestra a continuación: Foo a. Foo = (Foo) Dynamic. Proxy. new. Instance(new Foo. Impl()); a. Foo. do. Something(); a. Foo. do. Another(); n will result in invoke() intercepting do. Something() and do. Another() are called.

Estudio Concreto: Dynamic Proxies en Java: Ejemplo práctico n n “Aplicación Swing que permite

Estudio Concreto: Dynamic Proxies en Java: Ejemplo práctico n n “Aplicación Swing que permite al usuario cambiar el título de un frame” Se usa una instancia de la clase proxy para gestionar todos los eventos que puedan ocurrir en el frame: n n We’ll add a Window. Listener on the frame to close the application. We’ll add a Focus. Listener on the text field to change the background color of the text field to yellow when it has the focus. We’ll add an Action. Listener on the buttons to perform their actions. We’ll add a Document. Listener on the text field to enable the clear button only if the text field contains some text.

Estudio Concreto: Dynamic Proxies en Java: Ejemplo práctico 1. Crear la clase proxy que

Estudio Concreto: Dynamic Proxies en Java: Ejemplo práctico 1. Crear la clase proxy que implemente todos listeners que se necesitan. A continuación crear una instancia de la clase proxy. Estas dos operaciones se realizan mediante el método Proxy. new. Proxy. Instance() : . . . // Create the dynamic proxy instance a. Listener. Proxy = (Proxy) Proxy. new. Proxy. Instance( get. Class(). get. Class. Loader(), new Class[] { Window. Listener. class, Action. Listener. class, Focus. Listener. class, Document. Listener. class }, this); . . .

Estudio Concreto: Dynamic Proxies en Java: Ejemplo práctico 2. Para poder crear la instancia

Estudio Concreto: Dynamic Proxies en Java: Ejemplo práctico 2. Para poder crear la instancia de proxy necesitamos pasarle un Invocation. Handler object que recibirá todas llamadas a los métodos. . . // Adding the proxy on the Swing components add. Window. Listener((Window. Listener) a. Listener. Proxy); btn. Ok. add. Action. Listener((Action. Listener) a. Listener. Proxy); btn. Clear. add. Action. Listener((Action. Listener) a. Listener. Proxy); txf. Name. add. Focus. Listener((Focus. Listener) a. Listener. Proxy); txf. Name. get. Document(). add. Document. Listener((Document. Listener) a. Listener. Proxy);

Estudio Concreto: Dynamic Proxies en Java: Ejemplo práctico 3. Una vez tenemos todo esto,

Estudio Concreto: Dynamic Proxies en Java: Ejemplo práctico 3. Una vez tenemos todo esto, solamente falta poner el código en el método invoke() para implementar el comportamiento deseado: public Object invoke(Object a. Proxy, Method a. Method, Object[] some. Arguments) { // If a method invocation was done on the Window. Listener interface if (a. Method. get. Declaring. Class() == Window. Listener. class) { // Close the demo and exit the VM if (a. Method. get. Name(). equals("window. Closing")) { System. exit(0); } // If a method invocation was done on the Action. Listener interface } else if (a. Method. get. Declaring. Class() == Action. Listener. class) { // Perform the action of the buttons Action. Event an. Event = (Action. Event) some. Arguments[0]; if (an. Event. get. Source() == btn. Ok) { set. Title(txf. Name. get. Text()); } else { txf. Name. set. Text(""); }

Estudio Concreto: Dynamic Proxies en Java: Conclusiones n Desventajas n n creating Class objects

Estudio Concreto: Dynamic Proxies en Java: Conclusiones n Desventajas n n creating Class objects at runtime and using reflection to dispatch the method invocation is more CPU intensive and slower Ventajas n n the runtime generation of the class provides an alternative to reading. class files from the file system or from a remote server The first benefit can be used in an applet that utilizes RMI where the time to download the classes is critical It also provides the possibility of having a single point of method dispatching, the Invocation. Handler interface.

Estudio Concreto: Dynamic Proxies en C# n Dos maneras de llevarlo a cabo: n

Estudio Concreto: Dynamic Proxies en C# n Dos maneras de llevarlo a cabo: n n Usando la clase Real. Proxy Usando Reflection. Emit para generar una nueva clase en tiempo de ejecución que anule/implemente los métodos necesarios y que remita las invocaciones hacia un handler genérico

Estudio Concreto: Dynamic Proxies en C# n System. Reflection. Emit n n Creación de

Estudio Concreto: Dynamic Proxies en C# n System. Reflection. Emit n n Creación de nuevos tipos en tiempo de ejecución Generación dinámica de assemblies Simplifica la generación de código en runtime Los assemblies pueden ser: n n Transient: solo existen en memoria Permanent: son grabados en disco

Estudio Concreto: Dynamic Proxies en C# n n La implementación se lleva a cabo

Estudio Concreto: Dynamic Proxies en C# n n La implementación se lleva a cabo en una clase que heredará de Call. Handler (una versión de Invocation. Handler que se utilizaba en java) i los proxies serán creados por una clase Object. Factory (equivalente a la java. lang. reflect. Proxy de java) Considerando las interfaces y clases siguientes veamos como se implementaria: public interface IMy. Biz. Face { int Do. Something(); } public class Some. Class : IMy. Biz. Face { public int Do. Something() { Console. Write. Line("In Doing. Something(). . . "); return -347; } }

Estudio Concreto: Dynamic Proxies en C# n Para mantener listado de las llamadas public

Estudio Concreto: Dynamic Proxies en C# n Para mantener listado de las llamadas public class Trace. Decorator : Call. Handler { object _inner; public Trace. Decorator(object obj) { _inner = obj; } public override object Invoke(string p. Str. Method. Name, object[] parms) { Console. Write. Line("Proxyfying call. . . "); object ret = Invoke. Member(_inner, p. Str. Method. Name, parms); Console. Write. Line("End of proxyfied call. . . "); return ret; } }

Estudio Concreto: Dynamic Proxies en C# n La clase Call. Handler se define de

Estudio Concreto: Dynamic Proxies en C# n La clase Call. Handler se define de la siguiente forma: public abstract class Call. Handler { protected object Invoke. Member(object target, string method. Name, object[] parms) { return target. Get. Type(). Invoke. Member( method. Name, System. Reflection. Binding. Flags. Invoke. Method, null, target, parms); } public abstract object Invoke(string method. Name, object[] parms); }

Estudio Concreto: Dynamic Proxies en C# n El código necesario para utilizar este framework

Estudio Concreto: Dynamic Proxies en C# n El código necesario para utilizar este framework seria: //Objeto Some. Class source = new Some. Class(); //Se combina este objeto con la ayuda de un Call. Handler que añade //funcionalidad alrededor de los métodos del objeto Call. Handler source. Decoree = new Trace. Decorator(source);

Estudio Concreto: Dynamic Proxies en C# n Ahora deberíamos hacer: n n ((IMy. Biz.

Estudio Concreto: Dynamic Proxies en C# n Ahora deberíamos hacer: n n ((IMy. Biz. Face)source. Decoree). Do. Something(); Problema: n Source. Decoree es de tipo Call. Handler q no expone los mismos interfaces que el objeto inicial. Así pues esta línea de código generará una Invalid. Cast. Exception

Estudio Concreto: Dynamic Proxies en C# n Solución: n Es necesario introducir una etapa

Estudio Concreto: Dynamic Proxies en C# n Solución: n Es necesario introducir una etapa suplementaria, la creación de un proxy exponiendo los mismos interfaces que el objeto básico, entorno al handler: //Se construye un proxy entorno del handler para hacer como si se aplicara los mismos //interfaces que Some. Class //IMy. Biz. Face proxy = (IMy. Biz. Face)Object. Factory. New. Instance(typeof(Some. Class), source. Decoree); //A continuación se puede trabajar con el proxy como si se trabajara con el objeto //básico proxy. Do. Something();

Estudio Concreto: Dynamic Proxies en C# n Pasos a realizar n n Problema: n

Estudio Concreto: Dynamic Proxies en C# n Pasos a realizar n n Problema: n n Cifrar el método New. Instance() de Object. Factory para que genere el MSIL(Microsoft Intermediate Language) equivalente al que procedería de la compilación de la fuente anterior MSIL es complicado Solución: n System. Reflection. Emit proporciona un API bastante a alto nivel para generar de manera sencilla la mayoría de los elementos sintácticos como declaraciones de clases, de métodos…

Estudio Concreto: Dynamic Proxies en C# n Para emitir dinámicamente un tipo con System.

Estudio Concreto: Dynamic Proxies en C# n Para emitir dinámicamente un tipo con System. Reflection. Emitió, se sigue el siguiente proceso genérico: n n n Creación de un Assembly. Builder Apertura de un nuevo Module. Builder en el Assembly. Builder para contener el tipo Declaración con ayuda de un Type. Builder Adición de los campos Adición de los constructores con ayuda de Constructor. Builder, emisión del código con ayuda el ILGenerator de cada Constructor. Builder y de la enumeración Op. Codes Adición de los distintos métodos por medio de Method. Builders, emisión del código con ayuda el ILGenerator de cada Method. Builder y de la enumeración Op. Codes

Estudio Concreto: Dynamic Proxies en C# n Las principales clases e interfaces que se

Estudio Concreto: Dynamic Proxies en C# n Las principales clases e interfaces que se utilizan son las siguientes: App. Domain El ámbito en el cual se va a emitir el montaje dinámico Assembly. Builder Permite configurar y construir un assembly dinámicamente Module. Builder Permite configurar y construir un módulo para contener el código que se va a generar Type. Builder Declara y configura un nuevo tipo (interfaz, clase. . . ) de manera dinámica Field. Builder Declara un nuevo miembro Constructor. Builder Declara un nuevo constructor Method. Builder Declara y configura un método ILGenerator Emite el MSIL Enumeración Op. Codes Contiene los todos opcodes soportados por MSIL

Estudio Concreto: Dynamic Proxies en C# n Resultado del proceso: n n n Obtención

Estudio Concreto: Dynamic Proxies en C# n Resultado del proceso: n n n Obtención de Assembly. Builder y Type. Builder completos A partir del Assembly. Builser es posible guardar el assembly generado sobre el disco. A partir del Type. Builder es posible, gracias al método Create. Type, crear un System. Type que se puede utilizar directamente en el ámbito normal para crear objetos

Patrones de diseño Aplicaciones: otros patrones n Prototype n n n Memento n n

Patrones de diseño Aplicaciones: otros patrones n Prototype n n n Memento n n Java: Java. Bean C#: Clone C#: Object Serialization Strategy n Java: El paquete java. util. zip en las clases Checked. Input. Stream y Checked. Output. Stream utilizan 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 CRC 32 o Adler 32.

Patrones de diseño Conclusiones n Aplicación de patrones de diseño útil para: n n

Patrones de diseño Conclusiones n Aplicación de patrones de diseño útil para: n n n Diseño de nuevas aplicaciones Implementación de lenguajes de programación Dynamic Proxy: aplicación concreta n n Java C#

Referencias n n n n http: //java. sun. com/j 2 se/1. 4. 2/docs/api/java/lang/reflect/Proxy. html

Referencias n n n n http: //java. sun. com/j 2 se/1. 4. 2/docs/api/java/lang/reflect/Proxy. html http: //www. kuro 5 hin. org/story/2002/9/21/19225/2806 http: //www. javaworld. com/javaworld/jw-11 -2000/jw-1110 -proxy. html http: //www. dotnetguru. org/articles/dossiers/instrumentation/proxiesdynamiques. htm http: //java. sun. com/j 2 se/1. 3/docs/guide/reflection/proxy. html#api http: //www. cramon. dk/dynamicproxy. htm http: //java. sun. com/j 2 se/1. 3/docs/api/java/lang/reflect/Proxy. html http: //java. sun. com/j 2 se/1. 3/docs/guide/reflection/proxy. html http: //www. prabhums. org/weblogs/files/16 ddf 219448198 feede 4 b 3230470 fc 9 fint ercept_dproxy. htm http: //www. comp. lancs. ac. uk/computing/research/cseg/projects/REFLEX/RProxy / http: //www. ociweb. com/jnb/files/Proxy. Demo. java http: //www. codeproject. com/dotnet/dynamicproxy. asp http: //www. codeproject. com/csharp/Dynamic. Proxy. asp http: //joe. truemesh. com/blog/000181. html http: //blog. monstuff. com/archives/000098. html