DEV Community

Arthur Freitas
Arthur Freitas

Posted on

Dominando o Design Pattern Facade: Simplifique a Integração de Sistemas!

Descomplicando Integrações com o Design Pattern Facade

Saudações, Devs! 👋 Hoje vamos explorar o Design Pattern Facade, mostrando como ele pode ser eficaz para simplificar a comunicação com operações complexas e externas e internas, como o processamento de pagamentos em plataformas de terceiros.

O Que Torna o Facade Tão Impactante? 🧠

O Design Pattern Facade é crucial por vários motivos, especialmente quando lidamos com integrações externas:

  • Simplificar a comunicação: Facilita a interação com APIs de pagamento complexas e diversas.
  • Diminuir o acoplamento: Reduz a dependência do código cliente com APIs externas, permitindo fácil substituição ou adição de novos serviços de pagamento.
  • Facilitar modificações: Permite adaptar-se rapidamente a mudanças nas APIs de pagamento sem grandes alterações no código base.

Implementação Prática em TypeScript: Processamento de Pagamentos 📝

Vamos adaptar nosso cenário para incluir a comunicação com softwares de pagamento externos, como Stripe, PayPal, e serviços bancários para transferências.

Passo 1. Definindo Interfaces de Métodos de Pagamento

Adaptamos nossa interface para refletir a comunicação com serviços externos:

interface ExternalPaymentService {
  processPayment(amount: number): Promise<string>;
}
Enter fullscreen mode Exit fullscreen mode

Passo 2: Implementações Concretas para Comunicação com Serviços Externos

Implementamos adaptadores para cada serviço externo de pagamento:

class StripePaymentService implements ExternalPaymentService {
  async processPayment(amount: number): Promise<string> {
    // Lógica para processar o pagamento via Stripe
    return `Pagamento de ${amount} processado com sucesso via Stripe.`;
  }
}

class PaypalPaymentService implements ExternalPaymentService {
  async processPayment(amount: number): Promise<string> {
    // Lógica para processar o pagamento via PayPal
    return `Pagamento de ${amount} processado com sucesso via PayPal.`;
  }
}

class BankTransferService implements ExternalPaymentService {
  async processPayment(amount: number): Promise<string> {
    // Lógica para processar o pagamento via Transferência Bancária
    return `Pagamento de ${amount} processado com sucesso via Transferência Bancária.`;
  }
}
Enter fullscreen mode Exit fullscreen mode

Passo 3: Criando a Fachada de Pagamento

Agora, criamos uma fachada que encapsula a complexidade de escolher e chamar o método de pagamento apropriado:

class PaymentIntegrationFacade {
  private paymentServices: {[key: string]: ExternalPaymentService} = {
    stripe: new StripePaymentService(),
    paypal: new PaypalPaymentService(),
    bankTransfer: new BankTransferService(),
  };

  async processPayment(method: string, amount: number): Promise<string> {
    const service = this.paymentServices[method];
    if (!service) {
      return 'Método de pagamento inválido.';
    }
    return service.processPayment(amount);
  }
}
Enter fullscreen mode Exit fullscreen mode

Passo 4: Utilizando a Nova Fachada

Agora, a fachada gerencia a complexidade de interagir com diferentes plataformas de pagamento:

const paymentIntegrationFacade = new PaymentIntegrationFacade();

// Exemplos de chamadas
async function executePayment() {
  console.log(await paymentIntegrationFacade.processPayment('stripe', 100)); // Stripe
  console.log(await paymentIntegrationFacade.processPayment('paypal', 200)); // PayPal
  console.log(await paymentIntegrationFacade.processPayment('bankTransfer', 300)); // Transferência Bancária
}

executePayment();
Enter fullscreen mode Exit fullscreen mode

Conclusão

Este exemplo demonstra o poder do Design Pattern Facade em proporcionar uma interface simplificada para operações complexas, como o processamento de pagamentos.

Espero que este guia inspire suas próximas implementações, elevando a eficiência e a clareza do seu código. Até mais, Devs! 🚀

Top comments (0)