Sobes.tech
Junior

O que é o padrão 'Adaptador' na programação?

sobes.tech IA

Resposta da IA

O padrão "Adaptador" converte a interface de uma classe para outra que o cliente espera. É útil quando precisa usar uma classe existente, mas sua interface não corresponde ao que é necessário. Uma classe de envoltório (adaptador) é criada, contendo uma instância da classe adaptável e implementando a interface requerida, delegando as chamadas aos métodos correspondentes do objeto adaptável.

Tipos de adaptadores:

  • Adaptador de objeto: Usa composição. O adaptador contém uma referência ao objeto adaptável.
  • Adaptador de classe: Usa herança múltipla. O adaptador herda tanto da interface requerida quanto da classe adaptável (menos comum em Python, pois herança múltipla pode ser complexa).

Exemplo de adaptador de objeto:

Suponha que temos uma classe OldSystem, que queremos usar, mas seu método se chama old_request, e espera-se um método new_request.

// old_system.py
class OldSystem:
    def old_request(self):
        print("Requisição do sistema antigo processada.")

// new_interface.py
class NewInterface:
    def new_request(self):
        pass # Método abstrato esperado pelo cliente

// adapter.py
from old_system import OldSystem
from new_interface import NewInterface

class Adapter(NewInterface):
    def __init__(self, old_system):
        self._old_system = old_system

    def new_request(self):
        // Delegar chamada ao método do sistema antigo
        self._old_system.old_request()

// client.py
from old_system import OldSystem
from adapter import Adapter

def client_code(interface):
    interface.new_request()

// Uso
old_system_instance = OldSystem()
adapter_instance = Adapter(old_system_instance)

client_code(adapter_instance)

Aplicado para integrar sistemas antigos com novos, ou para usar bibliotecas de terceiros com interfaces incompatíveis.

Vantagens:

  • Permite que classes com interfaces incompatíveis trabalhem juntas.
  • Melhora a reutilização de código.
  • Separa a interface da implementação.

Desvantagens:

  • Pode aumentar o número de classes no projeto.
  • Adiciona um nível adicional de indireção.