Dedicado a mis proyectos en Gambas ,un lenguaje de programación parecido al Visual Basic + Java pero ampliamente mejorado y...¡¡para gnu/linux!!.La potencia del gnu/linux sumada a la facilidad del Basic



Consultas, Desarrollo de programas y petición de presupuestos:



Mostrando entradas con la etiqueta patrones de diseño. Mostrar todas las entradas
Mostrando entradas con la etiqueta patrones de diseño. Mostrar todas las entradas

viernes, 14 de febrero de 2014

Como eliminar los Select Case ( switch ) usando POO y el patrón Strategy.

Como eliminar los Select Case ( switch ) usando POO y el patrón Strategy.

La orden Select Case (o Switch en otros lenguajes de programación), tiene el inconveniente de que cada vez que tengamos que añadir más casos, supone que tengamos que modificar el código ya escrito anteriormente.

Aunque ya lo he comentado en otras entradas (ver referencia), voy a hacer un ejemplo simple para que veais el mecanismo de como se sustituye usando clases y el patrón Strategy:

Vamos a partir de este simple ejemplo:

->

El bucle Select  Case lo vamos a sustituir por la siguiente estructura de clases:



Estructura del proyecto:



Código de las Clases:
Clase Switch:
->

Fijaos en la opcion "add" y "remove" que nos van a permitir añadir o quitar opciones.

Clase Interface:
->

Clase Opcion1:
->

Las demas opciones, son muy parecidas, vease el codigo fuente completo.

Programa Principal: Mmain
->


Bueno, y pensareis ¿es mucho trabajo y más código para hacer lo mismo? ¿que ventajas obtengo?

La primera ventaja que teneis es que el código es fácilmente ampliable, ya que simplemente se le vais que tener que nuevas clases "opciones".
Y otra muy importante, durante la ejecución del programa, podemos añadir o quitar dinamicamente opciones, cosas que es imposible hacerlo usando un Select Case.

Próximamente os enseñaré un ejemplo de esto último que os comento "añadir o quitar dinámicamente en ejecución, opciones".

Codigo fuente completo: alojada en Box.Com

Entradas Relacionadas:
http://jsbsan.blogspot.com.es/2014/01/combinar-patrones-de-diseno-ejemplo-de.html

domingo, 19 de enero de 2014

Combinar Patrones de Diseño: Ejemplo de aplicación de varios patrones de diseño en un mismo programa: Command y Strategy

Combinar Patrones de Diseño

Ejemplo de aplicación de varios patrones de diseño  (Command y Strategy) en un mismo programa: Organizador de Descargas 

versión 0.0.3




Ayer os en traje un programa para organizar la carpeta de descarga, internamente usaba el patrón Command, para ejecutar las ordenes de las reglas (mover, copiar o borrar).

En el módulo "AplicarComandos", usaba una orden Select Case para, según que orden, crear el comando correspondiente y luego ejecutarlo en una lista:



Bien, este diseño (el uso del Select Case), tiene el siguiente problema:

  • A medida que vayamos a añadir más órdenes ("Comprimir", "Crear Accesos Directos en el Escritorio", etc), vamos a tener que retocar él codigo en esa zona. Rompiendo uno de los principios la programación "SOLID de Open Closed": Nuestro código debería estar abierto a la extensión, pero cerrado a la modificación.  Es decir, que para añadir una nueva funcionalidad, no tengamos la necesidad de modificar los algoritmos que ya están programados.El Patrón strategy, es una alternativa al uso de bloques "switch" ( select case) ya que permite:
  • Que sea fácil mantener y ampliar nuevas funcionalidades
  • Fácil lectura del código

Vamos a aplicar el siguiente esquema, para convertir el Switch (Select Case) del programa al patrón Strategy:

Esta serán nuestras nuevas clases:
Clase InterfaceCrearComando (GuardeStrategy en el esquema):
->

Clase EstrategiaBorrar: (seria la GuardedStrategyA)
->

Clase EstrategiaCopiar:(seria la GuardedStrategyA)
->

Clase EstrategiaMover:(seria la GuardedStrategyA)
->

SwitchStrategyCrearComando:
->

Y ahora en el módulo AplicarComando, habria que hacer 3 cambios:
Añadir una instancia privada de la clase SwitchStrategyCrearComando
->

Añadir una subrutina donde añadiremos las estrategias que existen (estrategiaCopia, estrategiaMover y estrategiaBorrar)
->

Y la zona del select case se sustituye por esta:
->

El resultado de la ejecución del programa es el mismo, pero para realizar futuras ampliaciones ahora resulta mucho más sencillo:




Para añadir un nuevo comando, por ejemplo se haría asi:
1) Crear la nueva clase que hereda de Comando, por ejemplo "Descomprimir", donde definimos su método ejecutar()
2) Crear una nueva clase EstrategiaDescomprimir, donde definimos las propiedades del comando
3) Añadir  en la subrutina GenerarListaEstrategiasCrearComandoDisponibles(), la nueva estrategia:
Dim estrategiaDescomprimirtmp as new EstrategiaDescomprimir
...
SelectorEstrategias.add(EstrategiaDescomprimir)

Y para que el usuario la vea en el formulario, en el Fmain, añadimos al combobox la nueva orden mediante el método add:
ComboBoxAccion.Add(("Deescomprimir"))

Y ya la tenedriamos añadida.

Saludos

Enlace de descarga del archivo de instalación .deb: http://clasificaryordenar.blogspot.com.es/
Enlace de descarga del código fuente: enlace version 0.0.3 (en el blog de clasificaryordenar se puede ver el codigo fuente de la última version)


Nota:
23/01/2014: He realizado un pequeño blog donde esta la información completa del programa y las ultima revisión 0.0.5 http://clasificaryordenar.blogspot.com.es/


Fuentes:
http://www.cin.ufpe.br/~sugarloafplop/final_articles/02_SwitchStrategy%20_Spanish_.pdf
http://programandonet.com/web/patrones-de-diseno-strategy/

domingo, 12 de enero de 2014

Uso de Patrones en Gambas3. El Libro en Lulu.com


Uso de Patrones en Gambas3. 

El Libro en Lulu.com



He recopilado todos los articulos que he realizado sobre el uso de patrones de diseño en Gambas3, haciendo un libro descargable en formato .Pdf desde la editorial online "Lulu.com".

Básicamente son los post publicados, convertidos en pdf, y ordenados según el tipo de patrón (creacionales, estructurales y de comportamiento). Seguramente a los que no les guste la "pesada" publicidad que hay mi blog, les resulte más cómodo su lectura teniéndolo todo en un archivo .Pdf.

 Aproximadamente he tardado 3 meses en hacer las 25 entradas, dedicándole aproximadamente unas 10 hora por cada una.

El precio es de 5 euros, y tiene los enlaces de descargas para que podais descargaros los ejemplos completos que estan alojados en box.com (sin publicidad).






Enlace:
http://www.lulu.com/shop/julio-sanchez-berro/uso-de-patrones-de-dise%C3%B1o-en-gambas3/ebook/product-21394631.html


Espero que os guste.

Saludos

sábado, 4 de enero de 2014

Esquema de Relaciones entre Patrones de Diseño

Esquema de Relaciones 

entre Patrones de Diseño


En las anteriores entradas (vease al final de este post, para ver el listado de las entradas), os he dejado ejemplos de uso de patrones de diseño en Gambas3. Si comparais entre los distintos patrones, podéis ver que hay ciertas similitudes entre ellos, realmente algunos son casos especiales de otros. 

En el siguiente esquema podeis ver como se relacionan los distintos patrones:



También existe una clasificación de los patrones:



Os dejo tambien el esquema de los patrones "gof" para tenerlo de hoja de referencia en formato pdf:




Aqui teneis  las distintas entradas y enlaces a los post de los ejemplos de patrones aplicados al lenguaje de programación Gambas3:

 



Patrones de Diseño



Nombre Ejemplo Enlace
Creacionales
Singleton Creando Log http://jsbsan.blogspot.com.es/2013/12/patron-singleton-ejemplo-creando-log.html
Builder Fabricar vehiculos de marca determinada. http://jsbsan.blogspot.com.es/2013/11/patron-builder-ejemplo-creando-coches.html
Prototype tipos de Tv http://jsbsan.blogspot.com.es/2014/01/patron-prototype-ejemplo-tipos-de.html
Abstract Factory La fabrica de vehiculos http://jsbsan.blogspot.com.es/2013/10/patron-abstract-factory-la-fabrica-de.html
Factory Method




Estructurales
Adapter Tipos de Motor http://jsbsan.blogspot.com.es/2013/12/patron-adaptador-ejemplo-tipos-de-motor.html
Decorador Cafés y Condimentos: recursividad http://jsbsan.blogspot.com.es/2013/10/patron-decorador-cafes-y-condimentos.html
Bridge Dibujando punteado y normal http://jsbsan.blogspot.com.es/2013/12/patron-bridge-ejemplo-dibujando.html
Composite Cálculo de gasto de sueldos mensuales http://jsbsan.blogspot.com.es/2013/11/patron-composite-ejemplos-calculo-de.html
Flyweight Formatos de tipo de letra y tamaño http://jsbsan.blogspot.com.es/2014/01/patron-flyweight-ejemplo-formatos-de.html
Facade Inmobiliaria: Clientes y departamentos http://jsbsan.blogspot.com.es/2013/11/patron-facade-fachada-ejemplo-de.html
Proxy Realizar un control de acceso a recursos y/o partes del programa http://jsbsan.blogspot.com.es/2013/12/patron-proxy-ejemplo-realizar-un.html
Delegation Empleado de Tienda http://jsbsan.blogspot.com.es/2013/12/patron-delegation-ejemplo-empleado-de.html



Comportamiento
Chain of Responsability Ordenes a Rambo http://jsbsan.blogspot.com.es/2013/11/patron-chain-of-responsibility-cadena.html
Command Implementar Deshacer y Rehacer ordenes http://jsbsan.blogspot.com.es/2013/11/patron-command-implementar-deshacer-y.html
Interpreter Evaluador de expresiones http://jsbsan.blogspot.com.es/2013/12/patron-interpreter-ejemplo-evaluador-de.html
Iterator Reccorrer una lista de diversas formas http://jsbsan.blogspot.com.es/2013/12/patron-iterator-ejemplo-recorrer-una.html
Mediator Chat y Conferencia http://jsbsan.blogspot.com.es/2013/11/patron-mediator-ejemplos-chat-y.html
Memento Marcador de futbol http://jsbsan.blogspot.com.es/2013/12/patron-memento-ejemplo-marcador-de.html
Observer Estación Meteorológica http://jsbsan.blogspot.com.es/2013/10/el-patron-observer-estacion.html
State Conexion/Desconexion y Ventanilla del Banco http://jsbsan.blogspot.com.es/2013/12/patron-proxy-ejemplo-realizar-un.html
Strategy Pato: Formas de volar http://jsbsan.blogspot.com.es/2013/10/el-principio-solid-de-open-closed-el.html
Template Method Valoración de un equipo de futbol http://jsbsan.blogspot.com.es/2013/10/patron-de-diseno-template-method.html
Visitor Cliente y Operador: añadiendo métodos http://jsbsan.blogspot.com.es/2013/11/patron-visitor-ejemplo-cliente-y.html

Fuentes:
http://es.wikipedia.org/wiki/Patr%C3%B3n_de_dise%C3%B1o

viernes, 3 de enero de 2014

Patrón Flyweight. Ejemplo Formatos de tipo de letra y tamaño


Patrón Flyweight


Motivo 
Este patrón comparte estados para soportar un gran número de objetos pequeños aumentando la eficiencia en espacio. [Gamma,1995]

Algunas aplicaciones pueden usar objetos durante todo su diseño, pero esto puede ocasionar implementaciones costosas. Ejemplo: La mayoría de editores de documentos tienen formato de texto y facilidades de edición que son implementados por alguna extensión. Típica mente editores de documento orientados a objetos usan objetos para representar elementos embebidos como tablas o figuras, así también utilizan objetos para representar cada carácter, manejar el editor de esta manera ofrece flexibilidad al sistema, pues pueden ser dibujados y formateados uniformemente, con figuras y tablas, pero la desventaja es que un documento de texto puede tener miles de caracteres, por eso tener un objeto por carácter implica un gran costo debido a la memoria que puede consumir. Flyweight permite compartir objetos ligeros, para hacer el programa más liviano. Para conseguir esto se utilizan objetos que almacenan los estados compartidos y que pueden ser usados por varios objetos simultáneamente. Los objetos pueden compartir estados intrínsecos que no dependen del contexto, pero no pueden compartir los estados extrínsecos que dependen del contexto

  • El estado intrínseco es almacenado en el objeto.
  • El estado extrínseco es pasado (contexto) como parámetro en las operaciones.



Aplicabilidad 

La efectividad de este patrón depende de cómo y cuándo es utilizado, por eso es importante implementarlo siempre que todas las siguientes situaciones se cumplan: 
  • Una aplicación usa un gran número de objetos. 
  • El coste de almacenamiento es alto debido al excesivo número de objetos. 
  •  La gran mayoría de los estados de los 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, pues el patrón se basa en el compartimento de objetos. 


Implementación:

  1. Asegurarse que la sobrecarga de objeto es un tema que necesita atención y el cliente de la clase es capaz y está dispuesto a absorber la responsabilidad de reajuste.
  2. Dividir la clase de estado de destino en: Estado compartible (intrínseco) y estado no compartible (extrínseco).
  3. Quitar el estado no compartible de los atributos de clase y agregarlo como argumento de llamada a la lista de métodos afectados.
  4. Crear un Factory que pueda almacenar en caché y reutilizar instancias de clases existentes.
  5. El cliente debe usar el Factory en lugar del operador new.
  6. El cliente (o un tercero) debe observar o calcular el estado no compartible y suministrar el estado a través de métodos de clase.


Relación con otros patrones
Mientras el patrón Flyweight muestra cómo hacer gran cantidad de pequeños objetos, Facade cómo hacer un único objeto representativo de un subsistema completo.
Flyweight es a menudo combinado con Composite para implementar nodos compartidos.
Flyweight explica cómo y cuándo objetos State pueden ser compartidos.

Diagrama UML:



Flyweight: declara una interfaz a través de la cual los flyweights pueden recibir y actuar sobre los estados no compartidos.
ConcreteFlyweight: implementa la interfaz Flyweight y almacena los estados compartidos, si los hay. Un objeto ConcreteFlyweight debe ser compartible. Cualquier estado que almacene debe ser intrínseco; es decir, debe ser independiente de su contexto.
UnsharedConcreteFlyweight: no todas las subclases de Flyweight tienen por qué ser compartidas. La interfaz Flyweight permite que se comparta; no lo fuerza. Es común que los objetos de esta clase tengan hijos de la clase ConcreteFlyweight en algún nivel de su estructura.
FlyweightFactory: crea y gestiona los objetos flyweight. Garantiza que los objetos flyweight se comparten de forma apropiada. Cuando un cliente solicita un flyweight, el objeto de la clase FlyweightFactory proporciona una instancia existente, o crea una.
Client: contiene referencias a los flyweights. Calcula o almacena los estados no compartidos de los flyweights.


Ejemplo: Formatos de tipo de letra y tamaño.
En este ejemplo se reciben varios tipos de letras, tamaño y texto. El programa se encargará de crear las clases formatos,  donde almacenará los distintos tipos de letras y tamaños.
Esquema de clases:

Esquema del proyecto:



Clase CreaLetra
->

Clase Formato
->

Clase FormatoFactory
->

Clase Letra
->

Clase TestFlyWeight
->

Programa Principal:
->


Salida del programa por consola:
->

Fuente: archivo almacenado en box.com

http://modelosprogramacion.blogspot.com.es/2009/05/flyweight.html
http://adrysmodelos.blogspot.com.es/2009/05/patron-de-diseno-flyweight-abstract.html -> ejemplo de caracteres
http://programacionsolida.com.ar/2012/03/patrones-de-diseno-estructurales_22.html

jueves, 2 de enero de 2014

Patrón Prototype. Ejemplo tipos de televisiones.




Patrón Prototype.

 Ejemplo tipos de televisiones.





"El patrón prototype tiene  como finalidad crear nuevos objetos duplicándolos, clonando una instancia creada previamente."
Se usa en un escenario donde sea necesario la creación de objetos parametrizados como "recién salidos de fábrica" ya listos para utilizarse, con la gran ventaja de la mejora de la performance: clonar objetos es más rápido que crearlos y luego darles valor a cada parametro en particular.
Este patrón debe ser utilizado cuando un sistema posea objetos con datos repetitivos, en cuanto a sus atributos: por ejemplo, si una biblioteca posee una gran cantidad de libros de una misma editorial, mismo idioma, etc. Hay que pensar en este patrón como si fuese un fábrica que tiene ciertas plantillas de ejemplos de sus productos y, a partir de estos prototipos, puede crear una gran cantidad de productos con esas características.


Diagrama UML:
Esquema UML

Prototype: declara la interface del objeto que se clona. Suele ser una clase abstracta.
PrototypeConcreto:las clases en este papel implementan una operación por medio de la clonación de sí mismo.
Cliente: crea nuevos objetos pidiendo al prototipo que se clone.

Los objetos de Prototipo Concreto heredan de Prototype y de esta forma el patrón se asegura de que los objetos prototipo proporcionan un conjunto consistente de métodos para que los objetos clientes los utilicen.



Ejemplo:
Vamos a crear una clase de  prototipos de TVs. Para ello crearemos la clase TV y dos subclases: LCD y Plasma.   Según este esquema:




Clase TV:
Esta clase tiene el método Clone() que se encarga de hacer una copia de si misma y de devolverla.
->

Clase LCD:
El método clone() lo redefinimos segun las propiedades de los tv del tipo LCD ->

Clase Plasma:
El método clone() lo redefinimos segun las propiedades de los tv del tipo Plasma ->

Clase TVPrototype:
En esta clase, predefinimos los distintos tipos que va a tener el cliente disponible.
->

Programa Principal:
->

Ejemplo de la aplicación funcionando:



enlace de descarga del ejemplo completo: enlace desde box.com




Fuente:
http://migranitodejava.blogspot.com.es/search/label/Prototype

viernes, 20 de diciembre de 2013

Patrón Interpreter. Ejemplo Evaluador de Expresiones Notación Polaca Inversa



Patrón Interpreter:

 Ejemplo Evaluador de Expresiones en Notación Polaca Inversa



Este patrón es un caso especial de “Composite”, aplicado al parseo. El parseo transforma una entrada de texto en una estructura de datos (usualmente un árbol) que es apropiada para ser procesada. Generalmente los parseadores primero identifican los símbolos de la entrada y luego construyen el árbol de parseo para esos símbolos. 
Dado un lenguaje, el patrón “Interpreter” define una representación para su gramática y un intérprete para su lenguaje. Se emplea para definir un lenguaje para definir expresiones regulares que representen cadenas a buscar dentro de otras cadenas. Utiliza una clase para representar cada regla gramática.



En el mundo real, los lenguajes están formados por expresiones no terminales que contienen construcciones terminales dentro. Encontramos el patrón “Interpreter” a la hora de analizar esas expresiones.
Este patrón se debe utilizar cuando hay un lenguaje que interpretar y se puede interpretar sus palabras como árboles sintácticos abstractos. Para ello, la gramática debe ser simple.

Ejemplo de árbol sintáctico abstracto:
Árbol de sintaxis abstracta para el siguiente código del algoritmo de Euclides:
while b ≠ 0
if a > b
a := a − b
else
b := b − a
return a
Esquema UML del patrón:

AbstractExpression: declara una interfaz para la ejecución de una operación.
TerminalExpression: implementa una operación asociada con los símbolos terminales de la gramática
NonterminalExpression: implementa una operación de interpretación asociada con los símbolos no terminales de la gramática.
Context: contiene información global para el interprete.
Client: construye un árbol sintáctico abstracto que representa una sentencia particular en el lenguaje que la gramática define. El cliente construye una expresión

Ventajas:

  • Facilidad para cambiar la gramática, mediante herencia, dado que las diferentes reglas se representan con objetos.
  • Facilidad para implementar la gramática, dado que las implementaciones de las clases nodo del árbol sintáctico son similares, pudiendo usarse para ello generadores automáticos de código.
  • Facilidad para introducir nuevas formas de “interpretar” las expresiones en la gramática.


Desventajas:

  • Limitación en el tipo de gramática: si no es simple, es casi imposible implementarlo.
  • No es conveniente utilizarlo si la eficiencia es un punto clave.


Ejemplo:  Evaluador de Expresiones. Ejemplo de la wikipedia ampliado
Se trata de evaluar expresiones matemáticas en notación polaca  inversa ( wikipedia  ). Vamos a tener encuenta las operaciones suma, resta, multiplicación y division. Ademas, si se produce algún error al analizar la expresión,  devolverá información sobre el, para que el usuario pueda modificar la expresion.
Proyecto:


Clase Expresion:
Va ha ser el interfase usado por las operaciones y numeros
->

Clase TerminalExpresion_Plus (operador suma)
->

Clase TerminalExpresion_Minus (operador resta )
->

Clase TerminalExpresion_Multi  (operador multiplicacion)
->
Clase TerminalExpresion _Div (operador  divisor)
->

Clase TerminalExpresion_Number (numero decimal)
->

Clase Parser:
Se encarga de recibir la expresion, construir el arbol y evaluar dicho arbol retornando informacion del valor o error producido
->

Clase Fmain: Programa principal
Formulario en pantalla, que rellenar el textbox con una expresion y pulsar el boton "Evaluar", se encarga de mostrar la información.
->

Captura de la aplicación ejecutandose:





Enlace de Descarga: enlace



Fuentes:
http://es.wikipedia.org/wiki/Interpreter_(patr%C3%B3n_de_dise%C3%B1o)
http://www.godtic.com/blog/2012/11/15/patrones-de-diseno-gof/
http://migranitodejava.blogspot.com.es/search/label/Interpreter
http://www.oodesign.com/interpreter-pattern.html
http://ldc.usb.ve/~mgoncalves/IS2/sd07/grupo6.pdf
http://www.blackwasp.co.uk/Interpreter.aspx
http://sourcemaking.com/design_patterns/interpreter/cpp/1

domingo, 15 de diciembre de 2013

Patrón Singleton: Ejemplo: Creando Log


Patrón Singleton:

 Ejemplo: creando log



El Patrón Singleton también se conoce como Instancia única, su objetivo es restringir la creación de objetos  pertenecientes a una clase, de modo que solo se tenga una única instancia de la clase para toda la aplicación, garantizando así un punto de acceso global al objeto creado.
Como observareis, en Gambas3, ya tenemos implementado ese patrón con el uso de los módulos (module).
Incluso, si lo queremos aplicar a una clase, usaríamos la orden Create Static, para convertirla en clase tipo Singleton.

Este patrón es  muy útil cuando necesitamos crear un clase común y global para todo el sistema.

Ejemplo:
Vamos a crear una aplicación que haga un log (un registro) de las acciones de los usuarios en los formularios (pulsar botones). Para ello usaremos una clase singleton (ClaseLogSingleton) que será la encargada de almacenar lo que hagan los usuarios.

Proyecto

Clase ClaseLogSingleton:


Clase PersonaVo:


Clase Main:


Clase (formulario) VentanaPrincipal


Clase (formulario) VentanaEventos:


Clase (formulario) VentanaLog:


Ejemplo de la aplicación:

enlace de descarga del ejemplo completo: enlace de descarga

Fuentes:
http://codejavu.blogspot.com.es/2013/07/ejemplo-patron-singleton.html
Documentación: http://gambasdoc.org/help/lang/createstatic?es&v3

martes, 10 de diciembre de 2013

Patrón Iterator: Ejemplo: Recorrer una lista de diversas formas

Patrón Iterator

 Ejemplo: 

Recorrer una lista de diversas formas




El objetivo principal de este patrón es la manipulación de datos mediante los indices de una estructura ya sea estática (Arrays) o dinámica (Listas). la condición de este patrón es que el acceso debe de ser secuencial mente, a continuación se mencionan algunas de las operaciones que puede contener una clase iterador:

      -Recorridos uno a uno hacia delante.
      -Recorridos uno a uno hacia atras.
      -Recorridos en saltos.
      -Aplicación de Filtros.
      -Aplicación de operaciones.
      -Consulta de un dato por su posición.
      -etc..





Ejemplo:
Vamos a tener una lista (array) de cadenas de texto, y la vamos a mostrarla de diversas maneras:
1) Del elemento 0 hasta el final
2) Desde el final hasta el elemento 0
3) Solo los elementos que ocupen posiciones pares en el array
4) Solo los elementos, cuyas cadenas  contentan la letra "m"

Proyecto:
Clase: Iterador


Clase IteradorHaciaAdelante:


Clase IteradorHaciaAtras:


Clase IteradorPares


Clase IteradorContenidoCadena


Programa principal:


Programa ejecutándose:



Enlace del ejemplo:enlace a box


Fuentes:
http://ayudajoe.blogspot.com.es/2012/03/patron-de-diseno-iterador-java.html
http://jarroba.com/arraylist-en-java-ejemplos/
http://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=589:ejercicio-y-ejemplo-resuelto-interface-iterable-y-metodo-iterator-java-cu00912c&catid=58:curso-lenguaje-programacion-java-nivel-avanzado-i&Itemid=180

http://jahepi.blogspot.com.es/2007/09/patrn-iterador-actionscript-30.html -> varios tipos de iteradores








domingo, 8 de diciembre de 2013

Patrón Memento: Ejemplo: Marcador de Futbol

Patrón Memento

Ejemplo: Marcador de Futbol



El patrón de comportamiento Memento, un modelo para capturar (parte o todo) y externalizar el estado interno de un objeto para restaurarlo más tarde sin violar el encapsulamiento. Puede ser usado  en combinación con los Patrones Command e Iterator. 
El patrón Memento es aplicable cuando: 
  • Todo o parte del estado de un objeto debe ser guardado para ser restaurado más tarde. 
  • Cuando una interfaz directa para obtener el estado de un objeto exponga detalles de su  implementación


Participantes 
· Memento.
  • - Almacena el estado interno de un objeto Originator. El Memento puede almacenar mucho o parte del estado interno de Originator. 
  • - Tiene dos interfaces. Una para Caretaker, que le permite manipular el Memento  únicamente para pasarlo a otros objetos. La otra interfaz sirve para que Originator pueda almacenar/restaurar su estado interno, sólo Originator puede acceder a esta interfaz, al menos en teoría. 
 · Originator.
  • - Originator crea un objeto Memento conteniendo una fotografía de su estado interno. 
  • - Originator usa a Memento para restaurar su estado interno. 

· Caretaker
  • - Es responsable por mantener a salvo a Memento. 
  • - No opera o examina el contenido de Memento

 Patrones relacionados
· Command: Puede usar “Mementos” para guardar el estado de operaciones restaurables.
· Iterator: “Mementos” puede ser usado con Iterator para buscar colecciones para estados específicos.

Ejemplo: Marcador de Fútbol
Se trata de realizar un marcador de fútbol, donde deberá aparecer:
-Resultado del 1º tiempo
-Resultado del 2º tiempo
-Resultado Final
-Nombre de Jugadores y minuto de cuando marca gol según el equipo.
Además se podrá deshacer y rehacer la introducción de resultados y jugadores.

Clases en el Proyecto:

Clase State:
Esta clase se encargará de almacenar los datos que nos interese del estado.

Clase Memento:


Clase Caretaker:


Programa Principal:





Captura de pantalla del programa en ejecucion:

Enlace de descarga: enlace a box

Enlaces:
http://www.slideshare.net/An3s/patron-memento
http://migranitodejava.blogspot.com.es/2011/06/memento.html
http://www.freewebz.com/amanecer/personal/papers/paper.memento.pdf


viernes, 6 de diciembre de 2013

Patrón Adaptador: Ejemplo tipos de motor

 Patrón Adaptador: 

Ejemplo tipos de motor

Este patrón permite la cooperación entre clases para extender sus funcionalidades a clases de diferentes tipos, que no pueden usarlas por mecanismos comunes como la herencia. 
Permite trabajar juntas a dos clases con interfaces incompatibles:
 Convierte la interfaz de una clase en otra interfaz que el cliente espera. Esto permite a las clases trabajar juntas, lo que de otra manera no podrían hacerlo debido a sus interfaces incompatibles

Este patrón se debe utilizar cuando:
  • Se quiere utilizar una clase que llame a un método a través de una interface, pero se busca utilizarlo con una clase que no implementa ese interface.
  • Se busca determinar dinámicamente que métodos de otros objetos llama un objeto.
  • No se quiere que el objeto llamado tenga conocimientos de la otra clase de objetos.
Diagrama UML patrón Adapter (Adaptador)

Target: define la interfaz específica del dominio que Cliente usa.
Client: colabora con la conformación de objetos para la interfaz Target.
Adaptee: define una interfaz existente que necesita adaptarse
Adapter: adapta la interfaz de Adaptee a la interfaz Target
El Cliente llama a las operaciones sobre una instancia Adapter. De hecho, el adaptador llama a las operaciones de Adaptee que llevan a cabo el pedido.



Ejemplo: Diversos tipos de motores
Queremos compartir funcionalidades (encender, acelerar y apagar), mediante la herencia creando una clase Motor,  entre estos tipos de motores: MotorComun, MotorEcologico y MotorElectrico.
Pero el MotorElectrico, se comporta de una manera muy diferente que los otros.
Para poderlo usar de la misma forma que los demás (con los mismos métodos), vamos a usar una clase adaptadora, que sirva de puente entre la clase padre "Motor" y la clase MotorElectrico, y que se encargue de traducir los métodos de la clase MotorElectrico a los métodos de clase "Motor" . Así el cliente podrá usar  los motores sin difirenciarlos.

Esquema del ejemplo:
http://codejavu.blogspot.com.es/2013/08/ejemplo-patron-adapter.html




Esquema del proyecto:

Clase Motor
->

Clase MotorComun
->

Clase MotorEconomico
->

Clase MotorElectrico
->

Clase MotorElectricoAdapter
Con esta clase, conseguimos adaptar el uso de la clase MotorElectrico con los métodos de la clase Motor
->

Clase Aplicacion:
->

Programa principal:
->

Resultado de la aplicación:

Enlace de descarga ejemplo: https://app.box.com/s/qflrvc7xtmalktjn4dge

Fuentes:
http://migranitodejava.blogspot.com.es/2011/06/adapter.html

http://codejavu.blogspot.com.es/2013/08/ejemplo-patron-adapter.html

http://pinbit.blogspot.com.es/2008/09/patrones-estructurales-i-patrn-adapter.html

jueves, 5 de diciembre de 2013

Patrón Delegation. Ejemplo: Empleado de Tienda



Patrón  Delegation
 Ejemplo: Empleado de Tienda


Se trata de una técnica en la que un objeto permite mostrar cierto método al exterior, pero internamente la implementación o las acciones desencadenadas por el llamado de este método se delega a otro objeto de una clase distinta pero asociado. La delegación es utilizada como un mecanismo para centralizar en torno a un solo objeto  los compartimentos (métodos) de varios objetos donde dichos comportamientos mantienen cierto nivel de relación.


Utilidad:

  • Cuando se quiere extender y reutilizar la funcionalidad de una clase sin utilizar la herencia.
  • Alternativa a la herencia múltiple, en lenguajes que no la soportan.

Ventajas:

  •  Cuando una clase que hereda de otra quiere ocultar algunos de los métodos heredados
  •  Compartir código que NO se puede heredar

Con herencia Múltiple y Delegación: simulándola con herencia simple y composición
Nota:
Diferencia entre Herencia y Composición: 

  • Herencia:  Debería modelar una relación es-un entre la clase derivada y la clase base.
  • Composición: La relación que modela es un tiene-un y, en general, la composición debe preferirse a la herencia.


Ejemplo:
Tenemos la clase EmpleadoTienda, que es a su vez Persona y Empleado. Podemos representarlo mediante herencia múltiple y también, usando el patrón delegation, con herencia simple :



En gambas3, se haría usando el patrón delegation.

Proyecto:


Clase Trabajador:
->

Clase Persona
->

Clase  EmpleadoDeTienda
Esta clase va a ser herencia de Persona y ademas está compuesta por una objeto de la clase Trabajador. En ella hemos definidos los métodos que llamarán a los métodos de la clase trabajador.

Programa Principal:
->



Pantallazo de la aplicación:



Enlace de descarga del ejemplo: enlace


Fuentes:
http://codejavu.blogspot.com.es/2013/06/ejemplo-patron-delegate.html
 http://siul02.si.ehu.es/~alfredo/iso/06Patrones.pdf
http://es.wikipedia.org/wiki/C%2B%2B#Herencia_simple
http://ingeniods.wordpress.com/2013/09/11/delegation-patron-de-diseno/

miércoles, 4 de diciembre de 2013

Patrón Bridge: Ejemplo dibujando punteado y normal


Patrón Bridge: 

Ejemplo dibujando punteado y normal




Este patrón permite modificar las implementaciones de una abstracción en tiempo de ejecución. Básicamente es una técnica usada en programación para desacoplar la interface de una clase de su implementación, de manera que ambas puedan ser modificadas independientemente sin necesidad de alterar por ello la otra.
Este patrón debe ser utilizado cuando:

  • Se desea evitar un enlace permanente entre la abstracción y su implementación. Esto puede ser debido a que la implementación debe ser seleccionada o cambiada en tiempo de ejecución.
  • Tanto las abstracciones como sus implementaciones deben ser extensibles por medio de subclases. En este caso, el patrón Bridge permite combinar abstracciones e implementaciones diferentes y extenderlas independientemente.
  • Cambios en la implementación de una abstracción no deben impactar en los clientes, es decir, su código no debe tener que ser recompilado.
  • Se desea compartir una implementación entre múltiples y este hecho debe ser escondido a los clientes.
  • Permite simplificar jerarquías demasiado pobladas.

Consecuencias

  • Desacopla interface e implementación: una implementación no es limitada permanentemente a una interface. Le es posible a un objeto cambiar su implementación en tiempo de ejecución. Este desacoplamiento fomenta las capas, que pueden conducir a un sistema mejor estructurado.
  • La parte de alto nivel de un sistema sólo tiene que conocer Abstraction e Implementor.
  • Mejora la extensibilidad: se puede extender las jerarquías de Abstraction e Implementor independientemente.
  • Esconde los detalles de la implementación a los clientes

Diagrama UML:

Abstraction: define una interface abstracta. Mantiene una referencia a un objeto de tipo Implementor.
RefinedAbstraction: extiende la interface definida por Abstraction
Implementor: define la interface para la implementación de clases. Esta interface no se tiene que corresponder exactamente con la interface de Abstraction; de hecho, las dos interfaces pueden ser bastante diferentes entre sí. Típicamente la interface Implementor provee sólo operaciones primitivas, y Abstraction define operaciones de alto nivel basadas en estas primitivas.
ImplementadorConcreto: implementa la interface de Implementor y define su implementación concreta.

Abstraction emite los pedidos de los clientes a su objeto Implementor. El cliente no tiene que conocer los detalles de la implementación.

Ejemplo:
Imaginemos que necesitamos dibujar distintas figuras geométricas (círculo, rectángulo, etc). Cada figura geométrica puede ser dibujada con diferentes tipos de líneas (normal, punteada, etc).
Vamos a combinar las clases de tal forma que tanto un Círculo como un Rectángulo sepan como dibujarse de manera abstracta, pero le dejaremos la implementación a un especialista en dibujo.
Esquema de clases:



Esquema del proyecto:

Partimos de las Clases especialistas en dibujar:
Clase Dibujo:
->

Clase DibujoNormal:
->


Clases DibujoPunteado:
->


Definimos la clase Forma, de donde heredan las de Circulo y Rectangulo.
Las clases Círculo y  Rectángulo sabrán como dibujarse pero de manera abstracta.
- Clase Forma
->

-Clase Circulo
->

-Clase Rectangulo
->

Programa principal:
->

Pantallazo de la aplicación ejecutándose:



Enlace de descarga del código fuente: enlace a box

fuente:
http://migranitodejava.blogspot.com.es/search/label/Bridge