Nombre del Patron



Descargar 66,08 Kb.
Fecha de conversión14.02.2017
Tamaño66,08 Kb.
Patrón Template Method

Introducción

Define una operación, el esqueleto de un algoritmo, delegando en las subclases algunos de sus pasos. Permite que las subclases redefinan ciertos pasos del algoritmo sin cambiar su estructura.



Nombre del Patron
Template Method (Metodo Plantilla).

Clasificacion del Patron
Patron de Comportamiento.

Intención
Proporcionar un metodo que permite que las subclases redefinan parte del metodo sin rescribirlo.

Motivación

Cuando se construyen jerarquias de clases complejas para una aplicacion, a menudo se duplican distintas partes de codigo. esa situacion no es deseable, porque la intencion es reutilizar tanto codigo como sea posible. La refactorizacion de codigo para que los metodos comunes esten en una superclase es un paso en la direccion correcta. El problema es que algunas veces una operacion que ha sido refactorizada confia en la informacion especifica que solamente esta disponible en una subclase. Debido a esto, los desarrolladores a menudo deciden no refactorizar y aceptar la presencia de codigo duplicado en distintas clases.



Estructura



Participantes

AbstractTemplate

 Implementa un metodo plantilla que define el esqueleto de un algoritmo y define metodos abstractos que implementan las subclases concretas.



ConcreteTemplate

 Implementa los métodos abstractos para realizar los pasos del algoritmo que son específicos de la subclase.



Colaboraciones

Las clases concretas confían en que la clase abstracta implemente la parte fija del algoritmo.



Consecuencias

Favorece la reutilización del código. Muy útiles para construir bibliotecas, pues ayuda a factorizar el comportamiento común de las clases.

Lleva a una estructura de control invertido (Principio de Hollywood): la superclase base invoca los métodos de las subclases.

Reflection Ejemplos [C#]


Los siguientes ejemplos muestran como cargar dinamicamente un assembly, como crear instancias de una clase, como invocar un método de una instancia, setear propiedades, etc

Crear una instancia desde un assembly que esta en las Referencias del proyecto


Este ejemplo crea instancias de la clase DateTime del System assembly.

[C#]


// create instance of class DateTime

DateTime dateTime = (DateTime)Activator.CreateInstance(typeof(DateTime));


[C#]


// create instance of DateTime, use constructor with parameters (year, month, day)

DateTime dateTime = (DateTime)Activator.CreateInstance(typeof(DateTime),

new object[] { 2008, 7, 4 });

Crear instancia desde un assembly cargado dinamicamente


Los siguientes ejemplos tartan de accede a la clase Calculator del assembly Test.dll assembly.

[C#]

namespace Test

{

public class Calculator



{

public Calculator() { ... }

private double _number;

public double Number { get { ... } set { ... } }

public void Clear() { ... }

private void DoClear() { ... }

public double Add(double number) { ... }

public static double Pi { ... }

public static double GetPi() { ... }

}

}


Ejemplos de uso de reflection para cargar la librería Test.dll, crear una instancia y accede a sus miembros (public/private, instance/static).

[C#]


// dynamically load assembly from file Test.dll

Assembly testAssembly = Assembly.LoadFile(@"c:\Test.dll");


[C#]


// get type of class Calculator from just loaded assembly

Type calcType = testAssembly.GetType("Test.Calculator");


[C#]


// create instance of class Calculator

object calcInstance = Activator.CreateInstance(calcType);


[C#]


// get info about property: public double Number

PropertyInfo numberPropertyInfo = calcType.GetProperty("Number");


[C#]


// get value of property: public double Number

double value = (double)numberPropertyInfo.GetValue(calcInstance, null);


[C#]


// set value of property: public double Number

numberPropertyInfo.SetValue(calcInstance, 10.0, null);


[C#]


// get info about static property: public static double Pi

PropertyInfo piPropertyInfo = calcType.GetProperty("Pi");


[C#]


// get value of static property: public static double Pi

double piValue = (double)piPropertyInfo.GetValue(null, null);


[C#]


// invoke public instance method: public void Clear()

calcType.InvokeMember("Clear",

BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public,

null, calcInstance, null);


[C#]


// invoke private instance method: private void DoClear()

calcType.InvokeMember("DoClear",

BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic,

null, calcInstance, null);


[C#]


// invoke public instance method: public double Add(double number)

double value = (double)calcType.InvokeMember("Add",

BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public,

null, calcInstance, new object[] { 20.0 });


[C#]


// invoke public static method: public static double GetPi()

double piValue = (double)calcType.InvokeMember("GetPi",

BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public,

null, null, null);


[C#]


// get value of private field: private double _number

double value = (double)calcType.InvokeMember("_number",



BindingFlags.GetField | BindingFlags.Instance | BindingFlags.NonPublic,

null, calcInstance, null);


La base de datos está protegida por derechos de autor ©absta.info 2016
enviar mensaje

    Página principal