Patrones de Diseño: Template Method y Facade (electivaprofundizacion2-fitco@googlegroups.com)

417 views
Skip to first unread message

Fernando Jimenez (Google Drive)

unread,
Nov 20, 2012, 12:28:20 AM11/20/12
to electivaprofun...@googlegroups.com
He compartido un elemento contigo
Documento Patrones de Diseño: Template Method y Facade

Instantánea del elemento debajo:

ELECTIVA PATRONES DE DISEÑO

Patrones de Diseño:

Template Method

Facade

FERNANDO R. JIMÉNEZ MENDOZA

fdoji...@informaticos.com

Cod: 11227029

JUAN CARLOS MEJÍA VEGA

juan_...@hotmail.com

Cod: 11227026

Ingeniero

JOAN SEPULVEDA VELEZ

FUNDACIÓN UNIVERSITARIA TECNOLÓGICO COMFENALCO

PROGRAMA DE INGENIERÍA DE SISTEMAS

Semestre IX

Cartagena, 19 de noviembre de 2012


Patrón  de diseño Témplate Method  

 

El patrón de diseño Témplate Method (Método Plantilla o Método Modelo) forma parte de la familia de patrones denominados de comportamiento. Este tipo patrones ayudan a resolver problemas de interacción entre clases y objetos.

Este patrón nace de la necesidad de extender determinados comportamientos dentro de un mismo algoritmo por parte de diferentes entidades. Es decir, diferentes entidades tienen un comportamiento similar pero que difiere en determinados aspectos puntuales en función de la entidad concreta.

Una posible solución podría ser copiar el algoritmo en cada de las diferentes entidades cambiando la parte concreta en la que difieren. Esta solución tiene una consecuencia negativa ya que se genera código duplicado.

La solución que propone el patrón Témplate Method es abstraer todo el comportamiento que comparten las entidades en una clase (abstracta) de la que, posteriormente, extenderán dichas entidades. Esta superclase definirá un método que contendrá el esqueleto de ese algoritmo común (método plantilla o Témplate Method) y delegará determinada responsabilidad en las clases hijas, mediante uno o varios métodos abstractos que deberán implementar.

Aplicabilidad:

El patrón de diseño  Témplate Method se utiliza adecuadamente en los siguientes casos:

  1. Cuando contamos con un algoritmo con varios pasos que no cambian, de modo que dichos pasos invariantes serían implementados en una superclase, dejando la implementación de los pasos que cambian para las subclases.
  2. Para evitar la replicación de código mediante generalización: se factoriza el comportamiento común de varias subclases en una única superclase.
  3. Para controlar las extensiones de las subclases. El Método Plantilla utiliza métodos especiales (métodos de enganche o hooks) en ciertos puntos, siendo los únicos puntos que pueden ser redefinidos y, por tanto, los únicos puntos donde es posible la extensión.

Estructura:

Se muestra a continuación la estructura que sigue el patrón Témplate Method:

Implementación:

A la hora de proceder a implementar este patrón, resulta de interés tener en cuenta los siguientes detalles:

  1. Es recomendable declarar las operaciones primitivas de tal forma que sólo puedan ser llamadas por el método plantilla (protected si se trabaja con el lenguaje de programación Java)
  2. Debe reducirse en la medida de lo posible el número de operaciones primitivas que van a ser invocadas desde el método plantilla. De este forma se reducirá la complejidad de las subclases y resultará menos tediosa su implementación

Ejemplo del patrón de diseño Témplate Method en java:

En este ejemplo se intenta ilustrar los grandes rasgos el modo de desplazamiento de un automóvil que, básicamente, se puede simplificar en: acelerar, cambiar de marcha y frenar. El proceso de acelerar y frenar se puede considerar que es idéntico en todos los automóviles, sin embargo la forma de cambiar de marcha varias de unos a autos según sean autos con cambio manual o autos con cambio automático.

public abstract class Automovil

{

        public void desplazar()

        {

        acelerar();

        cambiarMarcha();

        frenar();

        }

 

        private void acelerar()

        {

            System.out.println("Acelerando...");

        }

private void frenar()

        {

            System.out.println("Frenando...");

        }

 

        protected abstract void cambiarMarcha()

}

 

public class AutomovilManual extends AutoMovil

{

        protected void cambiarMarcha()

        {

            System.out.println("Cambiando de marcha de forma manual");

        }

}

 

public class AutomovilAutomatico extends AutoMovil

{

        protected void cambiarMarcha()

        {

            System.out.println("Cambiando de marcha de forma automática");

        }

}

FACADE

 

Su clasificación es estructural y fue creado con la intención de proveer una interfaz unificada para un conjunto de interfaces de un subsistema. Facade define una interfaz de alto nivel que hace, el subsistema fácil de usar.

Este fue creado para dividir un sistema en subsistemas, ayuda a reducir la complejidad del mismo, un diseño común disminuye las dependencias y comunicaciones entre subsistemas. Una forma de lograr esto es mediante el patrón facade, que provee una única y simple interfaz para el subsistema.

Sus principales aplicabilidades se encuentran:

  1. Quiere proveer una interfaz única para un subsistema complejo. Esto ayuda a que un subsistema sea más reusable y fácil de adaptar.
  2. Hay muchas dependencias entre clientes y clases que implementan una abstracción. Con el patrón facade se desacopla el cliente del subsistema, así como entre subsistemas; esto promueve subsistemas independientes y portables.
  3. Usted quiere dividir en capas su subsistema. Use facade para definir el punto de entrada a cada nivel del subsistema.
  4. Simplificar el uso y comprensión de una librería software.
  5. Encapsular un interfaz de librería poco amigable en un interfaz más coherente o mejor estructurado.

Estructura

Ejemplo en Java:

El siguiente ejemplo esconde un calendario con un API complicada detrás de un patrón Facade más amigable. La salida es:

Fecha: 2011-05-15

15 días después: 2011-05-30

import java.util.Calendar;

import java.util.Formatter;

import java.util.GregorianCalendar;

/** Fachada */

public class FormatoFecha {

        private GregorianCalendar gcal;

    public FormatoFecha(String isodate_ymd) {

            String[] a = isodate_ymd.split("-");

gcal = new GregorianCalendar(Integer.parseInt(a[0]), Integer.parseInt(a[1])-1, Integer.parseInt(a[2]));

        }

    public void sumarDias(int dias) {

        gcal.add(Calendar.DAY_OF_MONTH, dias);

    }

    public String toString() {

        return String.format("%1$tY-%1$tm-%1$td", gcal);

        }

}

/** Cliente */

public class Cliente {

        public static void main(String[] args) { 

        FormatoFecha d = new FormatoFecha("2011-05-15"); 

        System.out.println("Fecha: "+d); 

        d.sumarDias(15); 

        System.out.println("15 días después: "+d);

        }

}


Bibliografía

http://es.wikipedia.org/wiki/Template_Method_(patr%C3%B3n_de_dise%C3%B

http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=PatronTemplateMethod

http://modelosprogramacion.blogspot.com/2009/05/nombre-facade.html

http://es.wikipedia.org/wiki/Facade_(patr%C3%B3n_de_dise%C3%B1o)


Google Drive: crea y comparte contenido, y guárdalo todo en un solo lugar. Logotipo de Google Drive
Reply all
Reply to author
Forward
0 new messages