Padrão de método de modelo C#

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:

Padrão de método de modelo C#

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 ImportDatamétodo define as etapas para importar dados de um arquivo, transformar os dados e carregá-los em um banco de dados.

O ImportDatamétodo chama três métodos abstratos, Extract, Transforme Load, que representam as etapas específicas do processo ETL:

  • O Extractmétodo é responsável por ler os dados de um arquivo.
  • O Transformmétodo transforma os dados.
  • O Loadmétodo salva os dados transformados em um banco de dados.

Marcamos os métodos Extracte 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:LoadabstractTransformvirtualTransform

// 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 CSVToSQLServerclasse que herda da ETLclasse. Implementa CSVToSQLServero Extract()método para ler dados de um CSVarquivo 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 ExcelToMySQLclasse que estende a ETLclasse. A CSVToSQLServerclasse 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 CSVToSQLServere ExcelToMySQLpara 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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *