Universidad centroamericana Facultad de Ciencia, Tecnología y Ambiente. Implementación de Aplicaciones Orientadas a Objetos. Docente: Lic. Armando López. Patrón de Diseño: TemplateMethod.

Integrantes: Maritza Rodríguez Selva. Yulieth Patricia Pérez. Alcira Salinas Aguilar. Juan Ramón Castellón.

Patrones de Diseño TemplateMethod

Índice.

I. Introducción……………………………………………………………….....2 II. Desarrollo 1. Propósito de TemplateMethod.....……………………………………......3 1.1.

Sinónimos …………………………………………………………3

2. Problemática del patrón …………….…………………………………...3 3. Estructura de la solución…….………………………………………...…4 4. Participantes………………….………………………………………….. 4 5. Consecuencias…………………………………………………………….4 6. Colaboraciones…………………………………………………………... 4 7. Implementación …………….……………………………………………. 5 8. Patrones con los que se relaciona…………………………………… 12 III. Conclusiones……………………………………………………………...…13 IV. Bibliografía……………………………………………………………………14

1

Patrones de Diseño TemplateMethod

I.

Introducción.

La presente investigación expone el patrón de comportamiento: Template Method, el cual define en una operación el esqueleto de un algoritmo, delegando en las subclases algunos de sus pasos. (Erich Gamma). Además dicha investigación presenta la problemática a la cual es aplicable el patrón y la solución que propone Método Plantilla, con su debido diagrama de clases, asimismo se aborda la responsabilidad que tiene cada participante según el diagrama de la solución que se presenta. También se incorpora en este documento Método Plantilla.

un ejemplo de código implementando

2

Patrones de Diseño TemplateMethod

II. Desarrollo. Nombre del patrón: Template Method (Método Plantilla). Un Template 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. Sinónimos: No tiene. Propósito o finalidad: Define en una operación el esqueleto de un algoritmo, delegando en las subclases algunos de sus pasos. Permite que las subclases redefinan ciertos pasos de un algoritmo sin cambiar su estructura. Problemática: cuando es necesario realizar un algoritmo que sea común para muchas clases, pero con pequeñas variaciones entre una y otras; este problema es el de la repetición de código cuando diseñamos una estructura jerárquica dentro de cualquier sistema.

Estructura de la solución (Diagrama de clases) Este patrón nos ayuda a corregir uno de los errores más comunes en el desarrollo orientado a objetos; el problema de la repetición de código cuando diseñamos una estructura jerárquica dentro de cualquier sistema.

3

Patrones de Diseño TemplateMethod

Participantes (responsabilidad de cada clase). AbstractClass. Implementa un método plantilla que define el esqueleto de un algoritmo y define métodos abstractos que implementan las subclases concretas. Concret Class: Implementa los métodos abstractos para realizar los pasos del algoritmo que son específicos de la subclase.

Consecuencias Favorece la reutilización del código. Muy útiles para construir bibliotecas, pues ayuda a factorizar el comportamiento común de las clases. Colaboraciones (Diagrama de secuencias). Las clases concretas confían en que la clase abstracta implemente la parte fija del algoritmo.

4

Patrones de Diseño TemplateMethod

Implementación de Template Method: Cliente public class Principal extends javax.swing.JFrame {

/** Creates new form Principal */ public Principal() { initComponents(); }

/** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // private void initComponents() {

jLabel1 = new javax.swing.JLabel(); jButton1 = new javax.swing.JButton(); jLabel2 = new javax.swing.JLabel(); jLabel3 = new javax.swing.JLabel(); jButton2 = new javax.swing.JButton(); jLabel4 = new javax.swing.JLabel(); jLabel5 = new javax.swing.JLabel();

5

Patrones de Diseño TemplateMethod

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setBackground(new java.awt.Color(51, 153, 255)); setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));

jLabel1.setText("OBTENER DRIVER Y BASE DE DATOS");

jButton1.setText("Cargar"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } });

jLabel2.setText("SQL_JDBC:");

jLabel3.setText("Base de Datos:");

jButton2.setText("Conectar"); jButton2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton2ActionPerformed(evt); } });

jLabel4.setText("=================================================="); 6

Patrones de Diseño TemplateMethod

jLabel5.setText("==================================================");

javax.swing.GroupLayout layout javax.swing.GroupLayout(getContentPane());

=

new

getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(100, 100, 100) .addComponent(jLabel1)) .addGroup(layout.createSequentialGroup() .addGap(74, 74, 74) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel3) .addComponent(jLabel2)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jButton1) .addComponent(jButton2))) .addComponent(jLabel5) .addComponent(jLabel4) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 7

Patrones de Diseño TemplateMethod .addGroup(layout.createSequentialGroup() .addGap(31, 31, 31) .addComponent(jLabel1) .addGap(11, 11, 11) .addComponent(jLabel4) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel2) .addComponent(jButton1)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jButton2) .addComponent(jLabel3)) .addGap(18, 18, 18) .addComponent(jLabel5) .addContainerGap(35, Short.MAX_VALUE)) );

pack(); }//

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

prueba objeto; objeto = new ObtenerConexion();

8

Patrones de Diseño TemplateMethod objeto.ObtenerConexion(); }

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { prueba objeto; objeto = new ObtenerConexion(); objeto.ConectarBD(); }

/** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new Principal().setVisible(true); } }); }

// Variables declaration - do not modify private javax.swing.JButton jButton1; private javax.swing.JButton jButton2; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; 9

Patrones de Diseño TemplateMethod private javax.swing.JLabel jLabel5; // End of variables declaration

}

Clase Abstracta public abstract class prueba {

public void ObtenerConexion(){ }

public void ConectarBD(){ } }

Clase Concreta import javax.swing.JOptionPane; import java.sql.*; import java.util.logging.Level; import java.util.logging.Logger;

public class ObtenerConexion extends prueba{

Connection cn; ResultSet rs; PreparedStatement ps; 10

Patrones de Diseño TemplateMethod

public void ObtenerConexion(){ try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

JOptionPane.showMessageDialog(null,"Se ha cargado el controlador", "Carga", JOptionPane.WARNING_MESSAGE);

} catch(ClassNotFoundException e) { System.out.println("Error al cargar el driver"); }

}

public static Connection getConexion() throws SQLException { return DriverManager.getConnection("jdbc:sqlserver://localhost:1433;" + "databaseName=Northwind;user=sa;password=123"); }

public void ConectarBD() { try { cn = ObtenerConexion.getConexion(); 11

Patrones de Diseño TemplateMethod ps=cn.prepareStatement("Select * from Employees", ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rs=ps.executeQuery(); rs.next();

JOptionPane.showMessageDialog(null,"Se ha conectado a la base de Datos"); JOptionPane.showMessageDialog(null,rs.getString(2));

} catch (SQLException ex) { Logger.getLogger(ObtenerConexion.class.getName()).log(Level.SEVERE, null, ex); } } }

Patrones con los que se relaciona: Strategy. El Strategy usa la composición para cambiar todo el algoritmo, mientras que los métodos plantilla usan la herencia para cambiar parte de un algoritmo. Decorador: ya que los componente decorados tienen que llamarse desde métodos plantilla. Factory Method. Los métodos fábrica suelen llamarse desde métodos plantilla.

12

Patrones de Diseño TemplateMethod

III. Conclusiones.

Con el estudio del patrón Template Method concluimos que:

1. El patrón método plantilla debe su nombre a que utilizarlo es como cubrir una plantilla o un formulario: Una clase abstracta incluye un método concreto que hace de plantilla y el método plantilla llama a una serie de métodos abstractos que son como los huecos de la plantilla que deben incluir las subclases. 2. Se debe implementar cuando tenemos un comportamiento común en diferentes clases, puede ser refactorizado para evitar la duplicación de código

13

Patrones de Diseño TemplateMethod

IV. Referencias Bibliográficas.

Gamma, E. et al (2003). Patrones de diseño: elementos de software orientado a objetos reutilizable.Madrid: Pearson Educacion, S.A.

Roldan, J. (2010). Patrones de diseño: Template Method. Recuperado el miércoles 30 de marzo del 2011, de

http://tratandodeentenderlo.blogspot.com/2010/10/patrones-de-disenotemplate-method.html

14