Em engenharia de software, o padrão de projeto Adapter permite que você trabalhe com novas implementações sem modificar o código já existente. Por exemplo, se um framework utilizado pelo sistema é atualizado e algumas interfaces são alteradas nessa nova versão, você pode utilizar o padrão Adapter para permitir que o sistema acesse as novas funcionalidades sem alterar o código existente.
Resumidamente o padrão Adapter permite que duas interfaces incompatíveis, mas com funcionalidades semelhantes, trabalhem juntas.
Suponha que você tenha uma ChaveA que abre uma FechaduraA. Conceitualmente a fechadura é a interface que exige uma determinada chave para que a porta seja aberta:
Imagine que apareça no mercado um novo padrão de fechaduras, o qual requeira também um novo tipo de chave.
Seu sistema precisa implementar esse novo padrão, porém outras partes da aplicação continurão a usar o modelo antigo. Assim surge a questão: como atender a nova demanda sem prejudicar as outras partes que utilizam o padrão antigo? Em outras palavras, você precisa implementar o novo padrão, mas não poderá modificar o método estático abrir() da classe Cliente, o qual exige os modelos antigos de fechadura e chave!
O padrão Adapter resolve de forma eficiente essa questão. Ele torna possível utilizar as novas interfaces sem alterar o método abrir(). Para isso apenas precisamos criar uma classe que implemente a interface FechaduraA e também utilize as funcionalidades da interface da interface NovoPadraoFechaduraA. Chamemos esta classe de ChaveAAdaptador: