Resumo : neste tutorial, você aprenderá sobre o padrão Template Method e como implementá-lo em C#.
Introdução ao padrão de método de modelo C#
O padrão Template Method define o esqueleto de um algoritmo em uma superclasse e permite que subclasses redefinam etapas específicas do algoritmo sem alterar sua estrutura.
O diagrama UML a seguir ilustra o padrão Template Method:
Normalmente, o Template Method consiste em uma classe abstrata que define a estrutura do algoritmo e subclasses concretas que implementam as etapas específicas do algoritmo.
A classe abstrata fornece um conjunto de métodos modelo que as subclasses podem substituir para fornecer sua própria implementação.
Na prática, você usa o padrão Template Method quando tem um algoritmo que precisa implementar de maneira semelhante em várias classes, mas com algumas pequenas variações.
Em vez de duplicar o mesmo código em classes diferentes, você pode definir um modelo padrão em uma superclasse e, em seguida, substituir alguns métodos nas subclasses para personalizar as etapas correspondentes do algoritmo.
O padrão Template Method reduz a duplicação de código, aumenta a reutilização de código e facilita a manutenção e modificação do algoritmo no futuro.
Exemplo de padrão de método de modelo C#
O programa a seguir demonstra como usar o padrão Template Method para definir um algoritmo genérico para ler dados de um arquivo, transformá-los e armazená-los em um banco de dados, permitindo que subclasses substituam etapas específicas para lidar com diferentes formatos de arquivo e tipos de banco de dados:
namespace TemplateMethodPattern;
// Abstract class that defines the template method
// and its steps
public abstract class ETL
{
public void ImportData(string filename)
{
// Step 1: read data from file
var data = Extract(filename);
// Step 2: transform data
var transformedData = Transform(data);
// Step 3: store data in database
Load(transformedData);
}
protected abstract string[] Extract(string filename);
protected virtual string[] Transform(string[] data)
{
// Default implementation of transformation
// that does nothing
return data;
}
protected abstract void Load(string[] data);
}
// Concrete subclass that handles
// CSV files and SQL Server database
public class CSVToSQLServer : ETL
{
protected override string[] Extract(string filename)
{
// Read CSV file and return data as an array of strings
return File.ReadAllLines(filename);
}
protected override void Load(string[] data)
{
// Store data in SQL Server database
// Implementation omitted for brevity
Console.WriteLine("Store Data in SQL Server");
}
}
// Concrete subclass that handles
// Excel files and MySQL database
public class ExcelToMySQL : ETL
{
protected override string[] Extract(string filename)
{
// Read Excel file and return data as an array of strings
// Implementation omitted for brevity
return new string[] { "1,2,3", "4,5,6" };
}
protected override string[] Transform(string[] data)
{
// Transform Excel data to CSV format
// Implementation omitted for brevity
Console.WriteLine("Excel data transformed to CSV format");
return data;
}
protected override void Load(string[] data)
{
// Store data in MySQL database
// Implementation omitted for brevity
Console.WriteLine("Data stored in MySQL");
}
}
public class Program
{
static void Main(string[] args)
{
// Import CSV data into SQL Server
var csvSqlServerImport = new CSVToSQLServer();
csvSqlServerImport.ImportData("data.csv");
// Import Excel data into MySQL
var excelMySqlImport = new ExcelToMySQL();
excelMySqlImport.ImportData("data.xlsx");
}
}
Linguagem de código: C# ( cs )
Como funciona.
Primeiro, defina uma classe abstrata chamada ETL
(Extract, Transform, Load) que contém o método template chamado ImportData
.
O ImportData
método define as etapas para importar dados de um arquivo, transformar os dados e carregá-los em um banco de dados.
O ImportData
método chama três métodos abstratos, Extract
, Transform
e Load
, que representam as etapas específicas do processo ETL:
- O
Extract
método é responsável por ler os dados de um arquivo. - O
Transform
método transforma os dados. - O
Load
método salva os dados transformados em um banco de dados.
Marcamos os métodos Extract
e como para que as subclasses precisem implementá-los. Também marcamos o método como e fornecemos uma implementação padrão. As subclasses podem substituir o método se necessário:Load
abstract
Transform
virtual
Transform
// Abstract class that defines the template method
// and its steps
public abstract class ETL
{
public void ImportData(string filename)
{
// Step 1: read data from file
var data = Extract(filename);
// Step 2: transform data
var transformedData = Transform(data);
// Step 3: store data in database
Load(transformedData);
}
protected abstract string[] Extract(string filename);
protected virtual string[] Transform(string[] data)
{
// Default implementation of transformation
// that does nothing
return data;
}
protected abstract void Load(string[] data);
}
Linguagem de código: C# ( cs )
Segundo, defina a
classe que herda da CSV
ToSQLServerETL
classe. Implementa
o CSV
ToSQLServerExtract()
método para ler dados de um CSV
arquivo e o Load()
método para armazenar os dados em um banco de dados SQL Server:
// Concrete subclass that handles
// CSV files and SQL Server database
public class CSVToSQLServer : ETL
{
protected override string[] Extract(string filename)
{
// Read CSV file and return data as an array of strings
return File.ReadAllLines(filename);
}
protected override void Load(string[] data)
{
// Store data in SQL Server database
// Implementation omitted for brevity
Console.WriteLine("Store Data in SQL Server");
}
}
Linguagem de código: C# ( cs )
Terceiro, defina a ExcelToMySQL
classe que estende a ETL
classe. A CSVToSQLServer
classe implementa o Extract()
método para ler dados de um arquivo Excel e o Load()
método para armazenar os dados em um banco de dados MySQL Server:
// Concrete subclass that handles
// Excel files and MySQL database
public class ExcelToMySQL : ETL
{
protected override string[] Extract(string filename)
{
// Read Excel file and return data as an array of strings
// Implementation omitted for brevity
return new string[] { "1,2,3", "4,5,6" };
}
protected override string[] Transform(string[] data)
{
// Transform Excel data to CSV format
// Implementation omitted for brevity
Console.WriteLine("Excel data transformed to CSV format");
return data;
}
protected override void Load(string[] data)
{
// Store data in MySQL database
// Implementation omitted for brevity
Console.WriteLine("Data stored in MySQL");
}
}
Linguagem de código: C# ( cs )
Por fim, o Main()
método do programa utiliza as classes
e CSV
ToSQLServerExcelToMySQL
para importar dados de arquivos CSV e Excel e salvar os dados em SQL Server e MySQL, respectivamente.
public class Program
{
static void Main(string[] args)
{
// Import CSV data into SQL Server
var csvSqlServerImport = new CSVToSQLServer();
csvSqlServerImport.ImportData("data.csv");
// Import Excel data into MySQL
var excelMySqlImport = new ExcelToMySQL();
excelMySqlImport.ImportData("data.xlsx");
}
}
Linguagem de código: C# ( cs )
Resumo
- Use o padrão Template Method para definir o esqueleto de um algoritmo em uma superclasse e permitir que subclasses substituam etapas específicas do algoritmo sem alterar sua estrutura.