patron template
DESCRIPTION
Patron de Diseño Template, Ingenieria de SoftwareTRANSCRIPT
PATRONESTemplate Method ( Método Plantilla)
PATRONES
TEMPLATE METHOD
Un Template MethodTemplate Method es un patrón de diseño que define una estructura algorítmica en la súper clase, delegando la implementación a las subclases.
Es decir, define una serie de pasos, en donde los pasos serán redefinidos en las subclases.
WIKIPEDIA
TEMPLATE METHOD
PATRONES
Propósito
Proporcionar un método que permite que las sublclases redefinan partes del método sin rescribirlo
TEMPLATE METHOD
PATRONES
Donde Usar
• Este patrón se vuelve de especial utilidad cuando es necesario realizar un algoritmo que sea común para muchas clases, pero con pequeñas variaciones entre una y otras.
• Para proporcionar un esqueleto para un método, permitiendo que las subclases redefinan partes especificas del método
• Para centralizar partes de un método que se definen en todos los subtipos de una clase, pero que siempre tiene una pequeña diferencia en cada subclase
TEMPLATE METHOD
PATRONES
UML AbstractClass
+TemplateMethod()+PrimitiveOperation1()+PrimitiveOperation2()
ConcreteClass
+PrimitiveOperation1()+PrimitiveOperation2()
... PrimitiveOperation1()...PrimitiveOperation2()...
TEMPLATE METHOD
PATRONES
Participantes
AbstractClass (DataObject)
• Define las operaciones primitivas abstractas que las subclases concretas, definen para implementar los pasos de un algoritmo
• Implementa un método template definiendo el esqueleto de un algoritmo
ConcreteClass (CustomerDataObject)
• Implementa las operaciones primitivas
TEMPLATE METHOD
PATRONES
Ventajas y usos
• La principal ventaja es que facilita la reutilización de código, por eso es fundamental este patrón en muchos Frameworks
• Otro uso particular se da en la creación de sistemas de plugins. Por definición este patrón garantiza la existencia de distintos metodos en una clase que pueden ser "sobreescritos" por un descendiente.
TEMPLATE METHOD
PATRONES
Desventajas.
• Se puede producir ambigüedad si no se escribe bien
• Si el método plantilla llama demasiados métodos abstractos, se cansará pronto de utilizar AbstractClass como superclase.
TEMPLATE METHOD
PATRONES
Patrones relacionados
• Factory Method : los métodos plantilla a menudo llaman a métodos de fabricación para crear nuevas instancias sin conocer la clase exacta que se está creando
• Strategy: el patrón Strategy utiliza la composición para remplazar completamente el comportamiento, mientras que el patrón Template Method utiliza la herencia para sustituir partes del comportamiento
• Intercepting Filter : este utiliza el patrón Template Method para implementar su estrategia de filtros de plantilla
TEMPLATE METHOD
PATRONES
Ejemplo 1
Una operación de préstamo puede requerir varios pasos para finalizarse, asumamos que son los siguientes pasos
1. Verificar el balance bancario del cliente
2. Comprobar la puntuación de crédito del cliente en tres compañías diferentes
3. Verificar información sobre otros prestamos del cliente
4. verificar el valor del stock de acciones del cliente.
5. Revisar las futuras ingresos potenciales del cliente en el futuro
TEMPLATE METHOD
PATRONES
Cont…
La idea es usar un método plantilla que tenga los pasos del proceso, sin tener en cuenta la implementación real en las subclases.
Pueden existir varios tipos de prestamos,
Veamos como seria la implementación de este ejemplo usando Java
TEMPLATE METHOD
PATRONES
abstract class Verificaciones { public abstract void revisBanco(); public abstract void revisCredito(); public abstract void revisPrestamos(); public abstract void revisStock(); public abstract void revisIngresos();
public void verificar() { revisBanco(); revisCredito(); revisPrestamos(); revisStock(); revisIngresos(); }}
Métodos Primitivos
Método Template
TEMPLATE METHOD
PATRONES
class AppPrestamo extends Verificaciones { public void revisBanco() { System.out.println("verificar banco..."); } public void revisCredito() { System.out.println("verificar credito..."); } public void revisPrestamos() { System.out.println("verificar otros prestamos..."); } public void revisStock() { System.out.println("verificar stock..."); } public void revisIngresos() { System.out.println("verificar ingreso familiar..."); }
La clase AppPrestamo hereda de Verificaciones,para poder reescribir cada método primitivo
PATRONES
TEMPLATE METHOD
private String nombre;
public AppPrestamo(String nombre) { this.nombre = nombre; }
public String getNombre() { return nombre; }
Además posee estos métodos para determinar el nombre del cliente
PATRONES
TEMPLATE METHOD
Para finalizar una clase TestTemplate, que es donde se encuentra el main
class TestTemplate { public static void main(String[] args) {
AppPrestamo hipotecCliente = new AppPrestamo("Gokú"); System.out.println("cliente"+ hipotecCliente.getNombre()+ "Aplicacion para préstamo Hipotecario."); hipotecCliente.verificar();
AppPrestamo prestAccionesCliente = new AppPrestamo("Vegeta"); System.out.println("cliente"+ prestAccionesCliente.getNombre()+ "Aplicacion para prestamo de acciones. "); prestAccionesCliente.verificar(); }}
PATRONES
TEMPLATE METHOD
El resultado de este ejemplo sería el siguiente:
PATRONES
TEMPLATE METHOD
Ejemplo 2
El movimiento de un automóvil puede resumirse en tres pasos
• Acelerar
• Cambiar Marcha
• Frenar
Pero la forma en que se cambia la marcha puede variar de acuerdo al tipo de auto, pues puede ser automática o manual.
PATRONES
TEMPLATE METHOD
De acuerdo a lo anterior, podemos establecer lo siguiente, una clase abstracta Automovil que contenga un método Template que utilice las tres operaciones básicas.
abstract class Automovil{ public abstract void CambioMarcha(); public abstract void Acelerar(); public abstract void Frenar();
public void Andar(){
Acelerar(); CambioMarcha(); Frenar(); }}
Métodos Primitivos
Método Template
PATRONES
TEMPLATE METHOD
Ahora podemos definir unas Subclases de tipo Automóvil Manual y Automóvil Automatico
class AutomovilManual extends Automovil{
public void CambioMarcha(){ System.out.println("Cambio la Marcha como un auto manual"); } public void Acelerar(){ System.out.println("Acelerando como un auto manual"); } public void Frenar(){ System.out.println("Freno como un auto manual..."); }}
PATRONES
TEMPLATE METHOD
Y de tipo Automóvil Automático
class AutomovilAutomatico extends Automovil{
public void CambioMarcha(){ System.out.println("Cambio la Marcha como un auto automat"); } public void Acelerar(){ System.out.println("Acelerando como un auto automatico"); } public void Frenar(){ System.out.println("Freno como un auto automatico..."); }}
PATRONES
TEMPLATE METHOD
Para finalizar una clase TestAuto, que es donde se encuentra el main
class TestAuto{ public static void main(String[] args) {
AutomovilAutomatico automatico = new AutomovilAutomatico(); System.out.println("Prendiendo automovil automatico"); automatico.Andar();
AutomovilManual manual = new AutomovilManual(); System.out.println("Prendiendo automovil manual"); manual.Andar();
}}
PATRONES
TEMPLATE METHOD
El resultado de este ejemplo sería el siguiente:
PATRONES
TEMPLATE METHOD
PATRONES
TEMPLATE METHOD