> For the complete documentation index, see [llms.txt](https://diogomoreira.gitbook.io/padroes-de-projeto/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://diogomoreira.gitbook.io/padroes-de-projeto/padrao-adapter.md).

# Padrão Adapter

A utilização de frameworks e biblioteca de terceiros é muito comum durante o desenvolvimento de qualquer software, devido a **comodidade e facilidade de utilização**.

### Problema

Vamos considerar o seguinte exemplo: é preciso fazer **um sistema que manipule imagens**, para isto será utilizado uma biblioteca que oferece essas funcionalidades. Suponhamos que será necessário ter um método para carregar a imagem de um arquivo e outro para exibir a imagem na tela. Para fins didáticos, considere o exemplo abaixo

```java
public class ManipuladorImagemBibliotecaA {

    public void carregarImagem(String arquivo) {
        System.out.println("Imagem " + arquivo + " carregada.");
    }
 
    public void desenharImagem(int posicaoX, int posicaoY) {
        System.out.println("Image desenhada");
    }

}
```

Porém, existem outras alternativas de bibliotecas que oferecem a mesma funcionalidade, porém com nomes de métodos diferentes.

```java
public class ManipuladorImagemBibliotecaB {

    public void carregarDados(String arquivo) {
        System.out.println("Imagem " + arquivo + " carregada.");
    }
 
    public void exibirImagem(int largura, int altura, int posicaoX,
            int posicaoY) {
        System.out.println("Imagem exibida");
    }

}
```

Independente da biblioteca que escolhermos, teremos um cenário onde **nosso sistema depende da biblioteca**, uma vez que realizamos chamadas de métodos para essa biblioteca.

Como podemos então construir o sistema de maneira que ele fique independente de qual biblioteca será utilizada? De maneira que, caso seja decidido mudar a biblioteca por outra no futuro, nosso sistema não seja afetado?

### Solução

O Adapter atua como um "wrapper", **envolvendo dois objetos**. Sua intenção é:

"**Converter** a **interface de uma classe em outra interface, esperada pelo cliente**. O Adapter permite que **interfaces incompatíveis trabalhem em conjunto** – o que, de outra forma, seria impossível."

Ou seja, dado um conjunto de classes **com mesma responsabilidade, mas interfaces diferentes,** utilizamos o **Adapter** para unificar o acesso a qualquer uma delas. Precisamos então, inicialmente, fornecer uma interface comum para o cliente, oferencendo o comportamento que ele necessita

```java
public interface ManipuladorImagem {

    public void carregarImagem(String arquivo);
    public void desenharImagem(int largura, int altura, 
        int posicaoX, int posicaoY);

}
```

Dessa maneira, toda vez que precisarmos utilizar um **manipulador de imagem**, iremos usar apenas objetos dessa interface. Essas implementações, por sua vez, **estendem** ou **usam** objetos do Manipulador A ou B, delegando e adaptando as chamadas.

```java
public class ManipuladorImagemA extends ManipuladorImagemBibliotecaA 
    implements ManipuladorImagem {

    public void carregarImagem(String arquivo) {
        super.carregarImagem(arquivo);
    }
    
    public void desenharImagem(int largura, int altura, 
        int posicaoX, int posicaoY) {
        super.desenharImagem(posicaoX, posicaoY);
    }

}
```

De posse dos adaptadores, nosso cliente fica então independente de qual biblioteca será utilizada, utilizando apenas a interface comum definida no início.

```java
public static void main(String[] args) {
    ManipuladorImagem imagem = new ManipuladorImagemA();
    imagem.carregarImagem("teste.png");
    imagem.desenharImagem(0, 0, 10, 10);
 
    imagem = new ManipuladorImagemB();
    imagem.carregarImagem("teste.png");
    imagem.desenharImagem(0, 0, 10, 10);
}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://diogomoreira.gitbook.io/padroes-de-projeto/padrao-adapter.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
