Skip to content

Padrão Template Method

Pessoa, tudo bem? Hoje irei falar sobre um padrão de projeto que com certeza muitos sabem desenvolver, mas não sabem que se trata de um padrão. É um padrão que utilizado na medida certa facilita e melhora o design do sistema. O padrão de projeto que iremos descrever é Template Method.

Se tivermos que descrever o que é o padrão Template Method a descrição seria a seguinte: “separar um algoritmo genérico de um contexto detalhado“. Através de abstração, podemos colocar um algoritmo genérico em um método implementado e o detalhe especifico será consumido de métodos abstratos.

Desenvolvi um exemplo para facilitar o entendimento do padrão e abaixo irei discutir sobre o código escrito.

PatternTemplateMethod

[sourcecode language=”csharp”]

using System.Net;
using System.Net.Mail;

namespace PatternTemplateMethod
{
public abstract class EmailService
{
public abstract string To();
public abstract string Subject();
public abstract string Body();

public void Send()
{
var fromAddress = new MailAddress("suporte@email.com");
var toAddress = new MailAddress(To());

var message = new MailMessage(fromAddress.Address, toAddress.Address, Subject(), Body())
{
IsBodyHtml = true
};
var client = new SmtpClient("smtp.email.com", 587)
{
Credentials = new NetworkCredential("suporte@email.com", "suporte"),
EnableSsl = true
};

client.Send(message);
}
}
}

[/sourcecode]

[sourcecode language=”csharp”]

namespace PatternTemplateMethod
{
public class NewUserTemplate : EmailService
{
private readonly string _to;

public NewUserTemplate(string to)
{
_to = to;
}

public override string To()
{
return _to;
}

public override string Subject()
{
return "Olá novo usuário";
}

public override string Body()
{
return "Parabens por efetuar seu cadastro…";
}
}
}

[/sourcecode]

[sourcecode language=”csharp”]

namespace PatternTemplateMethod
{
public class UserDataChangedTemplate : EmailService
{
private readonly string _to;

public UserDataChangedTemplate(string to)
{
_to = to;
}

public override string To()
{
return _to;
}

public override string Subject()
{
return "Dados alterados";
}

public override string Body()
{
return "Você solicitou alteração em seus dados pessoais…";
}
}
}

[/sourcecode]

Uma rápida explicação sobre o contexto do sistema desenvolvido: Desenvolver envio de e-mail para usuários. Existe vários tipos de e-mails que podem ser enviados como por exemplo quando o usuário se cadastra no sistema e também quando a alteração de dados do usuário. Independente dos diferentes tipos de e-mails que podem ser enviados existe um código que será o mesmo (genérico), o processo de enviar o e-mail, pois as informações contidas no e-mail como titulo, corpo e para quem será enviado será um código detalhado (especifico).

Pensando no contexto do sistema, foi desenvolvida uma classe abstrata chamada “EmailService”. Nesta classe existe um método implementado chamado Send que tem por objetivo enviar e-mail utilizando métodos abstratos que foram implementados pelas classes filhas de “EmailService”.

Como sempre, utilizar padrão de projetos de maneira certa tem suas vantagens e a vantagem desse exemplo é que o código genérico foi isolado para ser reutilizado e adicionamos a responsabilidade de formatar o e-mail para as classes filhas de “EmailService” e com isso melhoramos o design de nosso sistema.

No exemplo do sistema eu poderia também utilizar o padrão Strategy (se quiserem saber mais clique aqui). Futuramente poderei escrever sobre as diferenças entre esses dois padrões que tem o objetivo de resolver o mesmo problema, isolar o código genérico.

Pessoal, fico por aqui e espero que tenham gostado desse padrão de projeto que discutimos hoje. Qualquer critica ou sugestão serão bem vindas.

Fiquem com Deus e até a próxima.

Published inQualidade de software

Be First to Comment

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *