Diferença entre o padrão do adaptador e o padrão do proxy?

33

Pelo que entendi, o padrão do adaptador está criando um objeto wrapper para nosso objeto real de interesse, simplesmente mais um nível de indireção, que fornece flexibilidade. a flexibilidade é que, se a interface do objeto real for alterada, mudaremos a interface do wrapper apontando para o objeto real, deixando a interface exposta do lado do cliente inalterada.

O padrão de proxy é o mesmo, com a diferença de que todo wrapper de proxy fornece apenas um subconjunto coerente da funcionalidade do objeto real. Por que isso seria útil, quando nos esforçamos para fazer "uma classe para um propósito" está além de mim.

Eu entendi isso corretamente?

Vorac
fonte

Respostas:

55

Não inteiramente.

O objetivo principal do padrão do adaptador é alterar a interface da classe / biblioteca A para as expectativas do cliente B. A implementação típica é uma classe de wrapper ou conjunto de classes. O objetivo não é facilitar futuras alterações na interface, mas incompatibilidades atuais da interface.

O padrão de proxy também usa classes de wrapper, mas para uma finalidade diferente. O objetivo do padrão de proxy é criar um substituto para um recurso real. Os motivos para usar um proxy podem ser

  • O recurso real reside em um computador remoto (o proxy facilita a interação com o recurso remoto)
  • O recurso real é caro para criar (o proxy garante que o custo não seja incorrido, a menos que / até que seja realmente necessário)

O mais importante é que um proxy forneça um substituto para o recurso real que ele é um substituto, portanto, ele deve fornecer a mesma interface.

Bart van Ingen Schenau
fonte
Primeiro de tudo, obrigado pela ótima resposta. Um proxy implementa todas as interfaces que o cliente atual precisa ou implementa todas as interfaces que o recurso real fornece?
Vorac
1
@Vorac: Isso depende da complexidade da interface e da sua filosofia de design. Ambos são possíveis, mas se a interface é grande / complexa ou você acredita fortemente no YAGNI, faz mais sentido implementar apenas o que você precisa.
Bart van Ingen Schenau
Portanto, considerando que o padrão do adaptador usa classes de wrapper, o padrão do adaptador é um padrão de proxy?
moonman239
@ moonman239: Não, porque a intenção de usar uma classe wrapper é diferente. Só porque dois padrões parecem semelhantes em um diagrama de classes não significa que eles estejam relacionados ou se implementem. Um fator importante para os padrões serem diferentes é a sua intenção.
Bart van Ingen Schenau 06/07/19