¿Que es?
Como dijimos en la entrada sobre patrones de diseño, el patrón delegate Permite extender y reutilizar la funcionalidad de una clase sin utilizar el mecanismo de herencia, donde la Clase C puede acceder a los método de la Clase B por medio de una instancia de esta ultima (No confundir con Bussines Delegate)...
El problema.
Vamos a hacer una aplicación pequeña donde nos piden realizar operaciones matemáticas pero los métodos de dichas operaciones se encuentran en clases diferentes...
La Solución.
Como nos dicen que los métodos a utilizar se encuentran en diferentes clases podemos utilizar el Patrón Delegate por medio de la relación "Usa" para indicar sobre la asociación y toma de funcionalidades entre la clase principal y las clases con operaciones, delegando la responsabilidad de ejecutar un proceso concreto usando otro objeto con los permisos para realizarlo.
La Aplicación.
Esta clase tiene el método dividir() que sera la operación principal de nuestra aplicación, posee los atributos numero1 y numero2 que serán heredados por la clase Ingreso desde donde se aplicará el patrón Delegate.
public class OperacionesMatematicas
{
public double numero1;
double numero2;
/**
* Permite dividir 2 numeros
* @param numero1
* @param numero2
* @return
*/
public double dividir(double numero1, double numero2)
{
return (numero1/numero2);
}
}
Clase Organiza.
Esta clase posee los métodos calculaMayor() y calculaMenor(), los cuales reciben los dos números ingresados por el usuario definiendo así el dividendo y el divisor.........como estos métodos son importantes por la aplicación y en vista de que java no posee la herencia múltiple, esta clase sera usada por medio del patrón Delegate para tener acceso a los métodos mencionados.
public class Organiza {
/**
* Metodo para calcular el mayor de entre 2 numeros
* @param a
* @param b
* @return
*/
public double calculaMayor(double a, double b){
if (a > b)
return a;
else
return b;
}
/**
* Metodo para calcular el menor de entre 2 numeros
* @param a
* @param b
* @return
*/
public double calculaMenor(double a, double b) {
if (a < b)
return a;
else
return b;
}
}
Clase Ingreso.
Esta clase permite obtener los números ingresados por el usuario, Se usa el mecanismo de herencia para obtener la funcionalidad de dividir que se encuentra en la clase OperacionesMatematicas, sin embargo antes de esto necesitamos definir cual es el dividiendo y el divisor por medio de los métodos que se encuentran en la clase Organiza.
Aquí es donde aplicamos el patrón Delegate, ya que como se ha mencionado anteriormente el lenguaje no permite la herencia múltiple así que la única manera de acceder a estos métodos es por medio de la relación "Usa" que provee el patrón Delegate, asi, creando una instancia de la clase Organiza delegamos las funciones al objeto miOrganiza para acceder a los metodos que calculan el numero mayor y el menor....
public class Ingreso extends OperacionesMatematicas
{
Organiza miOrganiza;
double mayor,menor;
public Ingreso()
{
miOrganiza=new Organiza();/**delega para emplear la relacion "Usa"*/
}
/**
* Permite el ingreso de 2 numeros enteros para el posterior
* calculo de su division
*/
public void ingresar()
{
try {
numero1=Integer.parseInt(JOptionPane.showInputDialog("valor1: "));
numero2=Integer.parseInt(JOptionPane.showInputDialog("valor2: "));
/**Usa miOrganiza para obtener el mayor*/
mayor=miOrganiza.calculaMayor(numero1, numero2);
/**Usa miOrganiza para obtener el menor*/
menor=miOrganiza.calculaMenor(numero1, numero2);
JOptionPane.showMessageDialog(null,"La division entre:" +
""+mayor+"/"+menor+" = "+dividir(mayor, menor));
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Error en el ingreso de datos");
}
}
}
Clase Principal.
Esta clase simplemente contiene el método main() y realiza el llamado a la clase Ingreso, donde inicia la aplicación...
public class Principal {
public static void main(String[] args){
Ingreso miIngreso=new Ingreso();
miIngreso.ingresar();
}
}
Conclusiones.
Como vemos este patrón es muy simple y lo mas normal es que muchos de nosotros lo hayamos utilizado sin saber, básicamente podemos extender nuestro sistema utilizando funcionalidades de otras clases, sin necesidad de utilizar la herencia.........el ejemplo fue muy simple y no tiene mayor grado de complejidad, pero sin importar el contexto de la aplicación en la que se utilice el objetivo será el mismo.....
También te podría Interesar.
- Ejemplo Pátron Observer.
- Ejemplo Modelo Vista Controlador.
- Que son los Patrones de Diseño ?
- Ejemplo Conectando Java con MySql
- Manejo de Excepciones en Java
- Conceptos Básicos de Programación Orientada a Objetos.
- ¿ String Vrs StringBuffer Vrs StringBuilder ?
- Repositorios y Control de Versiones
¿Hay algo que quieras anexar o comentar sobre esta entrada? no dudes en hacerlo....