🖥️
Padrões de Projeto
  • Padrões de Projeto
  • Orientação a Objetos
    • Conceitos básicos de orientação a objetos
      • Objetos e classes
      • Encapsulamento
      • Relacionamentos
      • Herança
      • Realização
      • Polimorfismo
      • Imutabilidade
  • Princípios SOLID
    • Introdução
    • SRP - Princípio de Responsabilidade Única
    • OCP - Princípio de Aberto/Fechado
    • LSP - Princípio de Substituição de Liskov
    • ISP - Princípio de Segregação de Interfaces
    • DIP - Princípio de Inversão de Dependência
  • Padrões de Projetos e catálogos
    • Introdução
  • Padrões Comportamentais
    • Padrão Strategy
    • Padrão State
    • Padrão Observer
    • Padrão Chain of Responsibility
    • Padrão Command
    • Padrão Template Method
    • Padrão Null Object
  • Padrões Criacionais
    • Padrão Singleton
    • Padrão Prototype
    • Padrão Builder
    • Padrões Factory
      • Factory Method
      • Abstract Factory
  • Padrões Estruturais
  • Padrão Adapter
  • Padrão Facade
  • Padrão Decorator
  • Padrão Proxy
  • Padrão Bridge
  • Padrão Composite
Powered by GitBook
On this page
  • Problema
  • Solução

Was this helpful?

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

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.

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

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.

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.

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);
}

PreviousAbstract FactoryNextPadrão Facade

Last updated 4 years ago

Was this helpful?