Eso es muy antiguo artículo en mi opinión, no recuerdo haber visto nombrando con Impl.
creo que Wikipedia tiene una mejor descripción:
El método de la plantilla se utiliza para:
vamos subclases implementan (a través de primordial método) el comportamiento que puede variar
duplicación evitar en el código: la estructura de flujo de trabajo general se implementa una vez en el algoritmo de la clase abstracta, y las variaciones necesarias se implementan en cada una de las subclases.
control en qué punto (s) se permite la subclasificación. A diferencia de una anulación polimórfica simple, donde el método base se reescribiría por completo, permitiendo un cambio radical en el flujo de trabajo, solo se permite el cambio de los detalles específicos del flujo de trabajo.
La estructura de control (inversión de control) que es el resultado de la aplicación de un patrón de plantilla se refiere a menudo como el Principio de Hollywood: "No nos llame, le llamaremos". Al usar este principio, el método de la plantilla en una clase principal controla el proceso general llamando a los métodos de las subclases según sea necesario.
En palabras simples, usted define el esqueleto en su clase base, y las clases derivadas implementan las diferencias entre las implementaciones.
Digamos que tenemos información que debe publicarse en diferentes canales.
Así que hacemos Publisher de la clase base, que tiene esqueleto de cómo hacerlo.
Obligamos a implementar la inicialización, que cada derivación establecería la dirección donde publicar.
Realizamos la implementación de envío, que se adapta a la mayoría de los canales y si algún canal usa ftp en lugar de http, permitimos anular el envío.
Y al iniciar sesión en la base de datos, lo que se hizo es lo mismo para todos los canales, por lo que no podemos omitirlo.
Solo la publicación es interesante para el usuario de la clase Derivada por editor, por lo que solo ese método es público.
public abstract class Publisher
{
private address;
// if you wish to force implementation in derived class, make method abstract
private abstract void Initialize();
// if you wish optional implementation in derived class, make it virtual
protected virtual void SendChangesToWeb()
{
// ...
webClient.Upload(address, data)
}
// if you wish that some step could not be changed from outside
private void LogSentChangesToDatabase()
{
// ... save date time when was send and what was sent
}
// this sequence is the same for all derives, no point to duplicate
public void PublishUpdates()
{
Initialize();
SendChangesToWeb();
LogSentChangesToDatabase();
}
}
public class GooglePublisher : Publisher {
private override Initialize()
{
address = "http://www.google.com";
}
}
public class FtpPublisher : Publisher {
private override Initialize()
{
address = "ftp://test.com";
}
protected override SendChangesToWeb()
{
FtpClient.Upload(address, data)
}
}
Gracias Giedrius, ese es un ejemplo muy informativo. Creo que realmente entiendo algo de este concepto ahora. Pero no sé si vale la pena profundizar más o si alguien está usando este estilo en el mundo práctico. – Aakash
Estilo de nomenclatura: no, pero el patrón se usa, es útil y bastante natural (natural, es decir, lo estaba usando sin saber que es un patrón bien conocido :). – Giedrius
:-) Quizás no me di cuenta de eso. Aunque es simple y ordenado. Gracias por toda tu ayuda. – Aakash