WEB RESOURCES

Gangs of Four (GoF) Design Patterns | DigitalOcean

Examples of GoF Design Patterns in Java's core libraries

Os padrões de design GoF são classificados em três categorias: criacionais, estruturais e comportamentais. Os padrões criacionais tratam da criação de objetos, enquanto os padrões estruturais lidam com a estrutura das classes, como herança e composição. Por fim, os padrões comportamentais lidam com a comunicação entre objetos e suas interações.Estes padrões de projeto se encontram no livro “Padrões de Projetos: Soluções Reutilizáveis de Software Orientado a Objetos” escrito por 4 autores denominados GoF (Gang of Four).

DESIGN_PATTERNS.jpg

<—> ADAPTER ****<—>

O padrão de design Adapter é um dos vinte e três padrões de design conhecidos que descrevem como resolver problemas de design recorrentes para projetar software orientado a objetos flexível e reutilizável, ou seja, objetos que são mais fáceis de implementar, alterar, testar e reutilizar. Esse padrão é usado quando um objeto existente não possui a interface desejada pelo cliente, e um adaptador é usado para permitir que o objeto existente trabalhe com o cliente [1].

Em outras palavras, o padrão Adapter permite que objetos com interfaces incompatíveis possam trabalhar juntos, o que aumenta a reutilização de classes existentes. O adaptador age como uma ponte entre dois objetos incompatíveis, permitindo que eles trabalhem juntos sem modificar o código-fonte original [2].

Existem duas variantes do padrão Adapter: a primeira é a adaptação de objetos, que usa a composição para combinar as interfaces de duas classes diferentes; a segunda é a adaptação de classes, que usa a herança para combinar as interfaces de duas classes diferentes. Em ambos os casos, a interface original do objeto ou classe é preservada, mas é possível que as operações possam ser executadas de maneira diferente ou que novas operações possam ser adicionadas [1].

Em resumo, o padrão Adapter permite que objetos incompatíveis possam trabalhar juntos, aumentando a reutilização de classes existentes. Ele pode ser implementado através da adaptação de objetos ou da adaptação de classes [3].

Exemplo usando adaptação de objetos:

Neste exemplo, temos um cliente que espera que uma interface TargetInterface seja implementada por qualquer classe com a qual trabalhe. No entanto, temos uma classe Adaptee existente que possui uma interface diferente. Para tornar o Adaptee compatível com o cliente, criamos uma classe Adapter que implementa TargetInterface e delega internamente ao objeto Adaptee.

 interface TargetInterface {
    void request();
}

class Adaptee {
    void specificRequest() {
        System.out.println("Adaptee's specificRequest() method is called.");
    }
}

class Adapter implements TargetInterface {
    private Adaptee adaptee;

    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    public void request() {
        adaptee.specificRequest();
    }
}

class Client {
    public void doSomething(TargetInterface target) {
        target.request();
    }
}

public class Main {
    public static void main(String[] args) {
        Client client = new Client();
        Adaptee adaptee = new Adaptee();
        TargetInterface adapter = new Adapter(adaptee);
        client.doSomething(adapter);
    }
}

Exemplo usando adaptação de classes:

Neste exemplo, temos o mesmo cenário de antes - um cliente que espera uma interface TargetInterface, mas temos uma classe Adaptee existente com uma interface diferente. Para tornar Adaptee compatível com o cliente, criamos uma classe Adapter que estende Adaptee e também implementa TargetInterface.