viernes, 1 de junio de 2007

Implementando el Patrón Decorador con C#

Para empezar vamos a Implementar el patrón decorador en C#. Lo primero será crear la interfaz IProcesarNombres.





using System;
using System.Collections.Generic;
using System.Text;
namespace patronDecorador
{
public interface IProcesarNombres
{
String ProcesarNombres(String Nombre, String Apellido);
}
}






Ahora bien, nuestra clase (en este caso puente) debe implementar esta interfaz.





using System;
using System.Collections.Generic;
using System.Text;
namespace patronDecorador
{
public class Puente : IProcesarNombres
{
private String _caracter = ", ";
public String Caracter
{
get { return _caracter; }
set { _caracter = value.Trim(); }
}
public String ProcesarNombres(String Nombre, String Apellido)
{
return Apellido.Trim() + Caracter + Nombre.Trim();
}
}
}







El decorador también debe implementarla como se muestra a continuación.






using System;
using System.Collections.Generic;
using System.Text;
namespace patronDecorador
{
public abstract class Decorador : IProcesarNombres
{
protected IProcesarNombres _Componente;
public Decorador(IProcesarNombres Clase)
{
_Componente = Clase;
}
public virtual String ProcesarNombres(String Nombre, String Apellido)
{
return _Componente.ProcesarNombres(Nombre, Apellido);
}
}
}



Luego creamos dos clases decoradoras:





1) AgregarNumeracion:



using System;
using System.Collections.Generic;
using System.Text;
namespace patronDecorador
{
public class AgregarNumeracion : Decorador
{
private Int32 _numero = 1;
public Int32 Numero
{
get { return _numero; }
set { _numero = value; }
}

private String _separador = " - ";
public String Separador
{
get { return _separador; }
set { _separador = value; }
}

public AgregarNumeracion(IProcesarNombres Clase): base(Clase){}

public override String ProcesarNombres(String Nombre, String Apellido)
{
return Numero.ToString()+ Separador + base.ProcesarNombres(Nombre, Apellido);
}
}
}





2) AgregarNacionalidad :



using System;
using System.Collections.Generic;
using System.Text;
namespace patronDecorador
{
public class AgregarNacionalidad : Decorador
{
private String _Nacionalidad= "Argentina";
public String Nacionalidad
{
get { return _Nacionalidad; }
set { _Nacionalidad = value.Trim(); }
}

private String _separador = " - ";
public String Separador
{
get { return _separador; }
set { _separador = value; }
}

public AgregarNacionalidad(IProcesarNombres Clase): base(Clase){}

public override String ProcesarNombres(String Nombre, String Apellido)
{
return base.ProcesarNombres(Nombre, Apellido) + Separador +Nacionalidad;
}
}
}








Ahora ya se puede comenzar a usarlas. Creamos el siguiente formulario:



A continuación el código que le da la funcionalidad:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using patronDecorador;
namespace WindowsApplication1
{
public partial class Decorador : Form
{
public Decorador()
{
InitializeComponent();
}

private void btn1_Click(object sender, EventArgs e)
{
Puente MiClase = new Puente();
txt1.Text= MiClase.ProcesarNombres(txtNombre.Text,txtApellido.Text);
}
private void btn2_Click(object sender, EventArgs e)
{
Puente MiClase = new Puente();
AgregarNumeracion Deco1 = new AgregarNumeracion(MiClase);
txt2.Text = Deco1.ProcesarNombres(txtNombre.Text,txtApellido.Text);
}
private void btn3_Click(object sender, EventArgs e)
{
Puente MiClase = new Puente();
AgregarNacionalidad Deco2 = new AgregarNacionalidad(MiClase);
Deco2.Nacionalidad = txtNacionalidad.Text;
txt3.Text = Deco2.ProcesarNombres(txtNombre.Text, txtApellido.Text);
}
private void btn4_Click(object sender, EventArgs e)
{
Puente MiClase = new Puente();
AgregarNumeracion Deco1 = new AgregarNumeracion(MiClase);
AgregarNacionalidad Deco2 = new AgregarNacionalidad(Deco1);
Deco2.Nacionalidad = txtNacionalidad.Text;
txt4.Text = Deco2.ProcesarNombres(txtNombre.Text, txtApellido.Text);
}
private void btn5_Click_1(object sender, EventArgs e)
{
AgregarNacionalidad FormaReducida = new AgregarNacionalidad(new AgregarNumeracion(new Puente()));
FormaReducida.Nacionalidad = txtNacionalidad.Text;
txt5.Text = FormaReducida.ProcesarNombres(txtNombre.Text, txtApellido.Text);
}
}
}

Como verán con una sola y sencilla linea se agrega funcionalidad al objeto:

AgregarNacionalidad FormaReducida = new AgregarNacionalidad(new AgregarNumeracion(new Puente()));

Esta es la principal ventaja del patrón Decorador.

A continuación su aplicación en VFP.


No hay comentarios.: