Skip to content

Commit

Permalink
Merge pull request #59 from UnBArqDsw2023-2/51-TemplateMethod
Browse files Browse the repository at this point in the history
51-template method
  • Loading branch information
LucasLopesFrazao authored Dec 1, 2023
2 parents 9ce56f6 + 12575b5 commit 00bf288
Show file tree
Hide file tree
Showing 9 changed files with 353 additions and 0 deletions.
46 changes: 46 additions & 0 deletions codigos/TemplateMethodValidation/TestTemplateMethod.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import { classeConcreta } from "./classeConcreta";

const TestTemplateMethod = () => {
const instancia = new classeConcreta();
console.log("Primeiro Exemplo");
console.log("----------------");
instancia.template(
"01234-567",
"1234-5678-9012-3456",
"0123",
"456789",
1,
new Date("2023-11-30"),
"BlueDragon87",
"FireStorm23"
);
console.log("");

console.log("Segundo Exemplo");
instancia.template(
"10001",
"2468-1357-9753-8642",
"0789",
"987654",
2,
new Date("2023-11-01"),
"GoldenTiger64",
"SunsetRoar19"
);
console.log("");

console.log("Terceiro Exemplo");
instancia.template(
"01234-567",
"6543-2109-8765-4321",
"0234",
"345678",
1,
new Date("2022-11-30"),
"BlueDragon87",
"FireStorm23"
);
console.log("");
};

TestTemplateMethod();
36 changes: 36 additions & 0 deletions codigos/TemplateMethodValidation/classeAbstrata.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
export abstract class classeAbstrata {
template(
cep: string,
numero_cartao: string,
agencia: string,
conta: string,
identificador: number,
data: Date,
usuario: string,
senha: string
): void {
if (!this.AtenticacaoUsuario(identificador, usuario, senha)) return;
if (!this.ValidacaoPedido(identificador, data)) return;
if (!this.ValidacaoReembolso(identificador, numero_cartao, agencia, conta))
return;
if (!this.ValidacaoEnvioEndereco(identificador, cep)) return;

// Se todos os passos forem bem-sucedidos, continue a execução
console.log("Todos os passos foram validados com sucesso");
}

// Métodos abstratos que serão implementados pelas subclasses concretas
abstract AtenticacaoUsuario(
identificador: number,
usuario: string,
senha: string
): boolean;
abstract ValidacaoPedido(identificador: number, data: Date): boolean;
abstract ValidacaoReembolso(
identificador: number,
numero_cartao: string,
agencia: string,
conta: string
): boolean;
abstract ValidacaoEnvioEndereco(identificador: number, cep: string): boolean;
}
63 changes: 63 additions & 0 deletions codigos/TemplateMethodValidation/classeConcreta.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import { classeAbstrata } from "./classeAbstrata";

const usuarioExemplo = {
nomeUsuario: "BlueDragon87",
senha: "FireStorm23",
};

let identificadorUsuario = 0;

export class classeConcreta extends classeAbstrata {
AtenticacaoUsuario(
identificador: number,
usuario: string,
senha: string
): boolean {
if (
usuario == usuarioExemplo.nomeUsuario &&
senha == usuarioExemplo.senha
) {
console.log(`Usuário Autenticado`);
identificadorUsuario = identificador;
return true;
}
return false;
}

ValidacaoPedido(identificador: number, data: Date): boolean {
const dataValida = new Date();
dataValida.setDate(dataValida.getDate() - 30);
if (dataValida <= data) {
console.log(`Pedido Válido para reembolso`);
return true;
}
return false;
}

ValidacaoReembolso(
identificador: number,
numero_cartao: string,
agencia: string,
conta: string
): boolean {
if (
(numero_cartao.length < 16 || numero_cartao.length > 13) &&
agencia.length == 4 &&
conta.length == 6
) {
console.log(`Metodo de reembolso é válido`);
return true;
}

return false;
}

ValidacaoEnvioEndereco(identificador: number, cep: string): boolean {
if (cep.length === 9) {
console.log(`CEP ${cep} é válido.`);
return true;
}

return false;
}
}
144 changes: 144 additions & 0 deletions codigos/TemplateMethodValidation/data.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
export const pedido = [
{
identificador: "1",
id: 1,
nome: "Chainsaw Man Vol. 13",
preco: 27.68,
categoria: "Livro",
marca: "Planet Manga",
cor: "Amarelo",
data: "2022-11-30",
},
{
identificador: "1",
id: 2,
nome: "Smartwatch X-200",
preco: 199.99,
categoria: "Eletrônicos",
marca: "TechGear",
cor: "Preto",
data: "2023-11-30",
},
{
identificador: "2",
id: 3,
nome: "Tênis Corrida Speedster",
preco: 120.5,
categoria: "Calçados",
marca: "FastFeet",
cor: "Azul",
data: "2023-11-01",
},
{
identificador: "4",
id: 4,
nome: "Câmera ProShot 4K",
preco: 879.9,
categoria: "Fotografia",
marca: "LensMaster",
cor: "Cinza",
data: "2023-09-18",
},
];

export const usuario = [
{
identificador: "1",
usuario: "BlueDragon87",
senha: "FireStorm23",
},
{
identificador: "2",
usuario: "GoldenTiger64",
senha: "SunsetRoar19"
},
{
identificador: "3",
usuario: "SilverFox42",
senha: "MoonlightHowl57"
},
{
identificador: "4",
usuario: "CrystalWings91",
senha: "StarlightGaze36"
},
];

export const metodoReembolso = [
{
identificador: "1",
numero_cartao: "1234-5678-9012-3456",
agencia: "0123",
conta: "456789",
banco: "Banco A",
nome_titular: "Alice Silva",
chave_pix: "[email protected]"
},
{
identificador: "3",
numero_cartao: "9876-5432-1098-7654",
agencia: "0456",
conta: "123456",
banco: "Banco B",
nome_titular: "Carlos Oliveira",
chave_pix: "[email protected]"
},
{
identificador: "2",
numero_cartao: "2468-1357-9753-8642",
agencia: "0789",
conta: "987654",
banco: "Banco C",
nome_titular: "Elena Pereira",
chave_pix: "[email protected]"
},
{
identificador: "1",
numero_cartao: "6543-2109-8765-4321",
agencia: "0234",
conta: "345678",
banco: "Banco D",
nome_titular: "Gabriel Santos",
chave_pix: "[email protected]"
},
];

export const endereco = [
{
identificador: "1",
País: "Brasil",
Nome: "Ana Silva",
Endereço: "Rua das Flores, 123",
Cidade: "São Paulo",
CEP: "01234-567",
Telefone: "(11) 98765-4321"
},
{
identificador: "2",
País: "Estados Unidos",
Nome: "John Smith",
Endereço: "123 Main Street",
Cidade: "New York",
CEP: "10001",
Telefone: "(212) 555-1234"
},
{
identificador: "1",
País: "Canadá",
Nome: "Emily Johnson",
Endereço: "Maple Avenue, 456",
Cidade: "Toronto",
CEP: "M5J 2T8",
Telefone: "(416) 789-0123"
},
{
identificador: "2",
País: "Austrália",
Nome: "David Lee",
Endereço: "Ocean Street, 789",
Cidade: "Sydney",
CEP: "2000",
Telefone: "(02) 9876-5432"
},
];

64 changes: 64 additions & 0 deletions docs/ArquiteturaReutilizacao/4.2.ReutilizacaoDeSoftware.md
Original file line number Diff line number Diff line change
Expand Up @@ -452,3 +452,67 @@ Após algumas atualizações de status, o primeiro cliente (cliente1) é removid
</figcaption>

![Notificação - Observer](./assets/Observer/main.jpg)

## Validação de Dados - Template Method

O Template Method é um padrão de design comportamental que define a estrutura de um algoritmo, permitindo que partes de seu comportamento sejam alteradas por subclasses sem alterar a estrutura geral.

A ideia básica por trás do Template Method é fornecer um esqueleto de algoritmo em uma classe base, com certas etapas marcadas como "métodos abstratos" que devem ser implementados pelas subclasses. Esses métodos abstratos representam variações específicas de uma etapa do algoritmo, permitindo que as subclasses personalizem partes específicas do comportamento sem reescrever o algoritmo inteiro.

O padrão Template Method é frequentemente usado em situações em que há um algoritmo comum que precisa ser aplicado, mas existem variações específicas nas etapas desse algoritmo. Ele é útil quando você deseja evitar a duplicação de código, fornecendo uma estrutura comum e permitindo que partes específicas do algoritmo sejam implementadas por subclasses.

Na figura 18 segue o diagrama do template method no contexto de validação de dados no processo de devolução de um produto no site da Amazon.

<figcaption style="text-align: center">
<b>Figura 18: Diagrama </b>
</figcaption>

![Validacao - Template](./assets/Template_Diagrama.png)

</div>
<figcaption style="text-align: center">
<b>Autor: Elaboração Própria (Artur Vinicius e Mateus de Almeida)</b>
</figcaption>
<div style="text-align: center">

Uma classe abstrata é uma classe que não pode ser instanciada diretamente e geralmente é usada como uma base para outras classes. Ela é projetada para ser estendida por subclasses que implementam ou fornecem implementações concretas para seus métodos abstratos.

<figcaption style="text-align: center">
<b>Figura 19: Classe Abstrata </b>
</figcaption>

![Validacao - Template](./assets/Template_Abstract.png)

</div>
<figcaption style="text-align: center">
<b>Autor: Elaboração Própria (Artur Vinicius e Mateus de Almeida)</b>
</figcaption>
<div style="text-align: center">

Uma classe concreta é uma classe que pode ser instanciada diretamente, ao contrário de uma classe abstrata. Em uma classe concreta, todos os métodos abstratos da classe base (se houver) são implementados, e a classe pode ser usada para criar objetos.

<figcaption style="text-align: center">
<b>Figura 20: Classe Concreta </b>
</figcaption>

![Validacao - Template](./assets/Template_Concret.png)

</div>
<figcaption style="text-align: center">
<b>Autor: Elaboração Própria (Artur Vinicius e Mateus de Almeida)</b>
</figcaption>
<div style="text-align: center">

A Main para executar instanciar as classes e testar a os métodos desenvolvidos na classeconcreta.

<figcaption style="text-align: center">
<b>Figura 21: Main </b>
</figcaption>

![Validacao - Template](./assets/Template_Main.png)

</div>
<figcaption style="text-align: center">
<b>Autor: Elaboração Própria (Artur Vinicius e Mateus de Almeida)</b>
</figcaption>
<div style="text-align: center">
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 00bf288

Please sign in to comment.