Template Method Pattern – definirea scheletului unui algoritm
Template Method este un behavioral pattern care definește scheletul unui algoritm într-o clasă de bază, lăsând anumite etape ale algoritmului să fie implementate sau personalizate de clasele derivate.
👉 Ideea-cheie: structura algoritmului rămâne fixă, dar pașii pot varia.
Este extrem de util atunci când:
-
ai mai multe variante ale aceluiași proces,
-
vrei să eviți duplicarea codului,
-
vrei să impui o ordine clară de execuție.
Când folosim Template Method?
✔ Procese standardizate (ex: import date, generare rapoarte, workflow-uri)
✔ Framework-uri și librării (ASP.NET, NUnit, etc.)
✔ Când vrei control asupra fluxului, dar flexibilitate în implementare
Structura pattern-ului
-
Abstract Class
-
definește metoda TemplateMethod()
-
implementează pașii comuni
-
declară metode abstracte sau virtuale pentru pașii variabili
-
-
Concrete Classes
-
implementează pașii specifici
-
Exemplu real: procesarea unui raport
Să presupunem că avem mai multe tipuri de rapoarte:
-
raport PDF
-
raport Excel
Fluxul este același:
-
Validare date
-
Generare conținut
-
Salvare raport
Implementare C#
Clasa abstractă (Template)
public abstract class ReportGenerator
{
// Template Method
public void GenerateReport()
{
ValidateData();
GenerateContent();
SaveReport();
}
protected virtual void ValidateData()
{
Console.WriteLine("Validare date raport...");
}
protected abstract void GenerateContent();
protected virtual void SaveReport()
{
Console.WriteLine("Salvare raport...");
}
}
👉 Observă:
-
GenerateReport() NU este virtual → nu poate fi schimbat fluxul
-
doar pașii sunt extensibili
Implementare concretă – PDF
public class PdfReportGenerator : ReportGenerator
{
protected override void GenerateContent()
{
Console.WriteLine("Generare conținut PDF...");
}
protected override void SaveReport()
{
Console.WriteLine("Salvare raport PDF...");
}
}
Implementare concretă – Excel
public class ExcelReportGenerator : ReportGenerator
{
protected override void GenerateContent()
{
Console.WriteLine("Generare conținut Excel...");
}
}
Utilizare
class Program
{
static void Main()
{
ReportGenerator pdfReport = new PdfReportGenerator();
pdfReport.GenerateReport();
Console.WriteLine();
ReportGenerator excelReport = new ExcelReportGenerator();
excelReport.GenerateReport();
}
}
Output
Validare date raport...
Generare conținut PDF...
Salvare raport PDF...
Validare date raport...
Generare conținut Excel...
Salvare raport...
Hook methods (opțional)
Poți introduce hook methods — metode virtuale goale, care pot fi suprascrise, dar nu sunt obligatorii.
protected virtual bool ShouldSendNotification()
{
return false;
}
Avantaje
✅ elimină duplicarea codului
✅ impune o structură clară
✅ ușor de extins
✅ ideal pentru framework-uri
Dezavantaje
⚠ moștenire rigidă
⚠ prea multe override-uri pot complica designul
⚠ schimbările în clasa de bază pot afecta toate implementările
Template Method vs Strategy
|
Template Method |
Strategy |
|---|---|
|
Moștenire |
Compoziție |
|
Flux fix |
Algoritm complet interschimbabil |
|
Control central |
Flexibilitate maximă |
👉 Dacă vrei ordine fixă, folosește Template Method
👉 Dacă vrei algoritmi complet diferiți, folosește Strategy
Concluzie
Template Method Pattern este ideal atunci când:
-
ai un proces bine definit,
-
vrei extensibilitate controlată,
-
construiești aplicații .NET scalabile și curate.