WEB RESOURCES
Gangs of Four (GoF) Design Patterns | DigitalOcean
Examples of GoF Design Patterns in Java's core libraries
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).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].
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);
}
}
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
.