Un esempio semplice d'implementazione del pattern TemplateMethod all'interno del Framework .NET è costituito dalla renderizzazione dei server control web:
// ...
namespace System.Web.UI.WebControls
{
public class WebControl // ...
{
protected override void Render(HtmlTextWriter writer)
{
RenderBeginTag(writer);
RenderContents(writer);
RenderEndTag(writer);
}
public virtual void RenderBeginTag(HtmlTextWriter writer)
{
// ...
}
protected virtual void RenderContents(HtmlTextWriter writer)
{
// ...
}
public virtual void RenderEndTag(HtmlTextWriter writer)
{
// ...
}
// ...
}
}
I ruoli sono chiari:
- la classe WebControl fa da AbstractClass (anche se non è abstract);
- le classi che derivano da WebControl fanno da ConcreteClass;
- il metodo Render fa da TemplateMethod;
- i metodi RenderBeginTag, RenderContents e RenderEndTag fanno da PrimitiveOperation.
Perciò quando si deriva da WebControl, non si deve sovrascrivere Render (che in questo caso rappresenta l'algoritmo) ma RenderContents (e/o RenderBeginTag, RenderEndTag) cioè le operazioni (i passi dell'algoritmo).
L'album del giorno: Folco Orselli - La spina