Padrão Adapter Projeto de Sistemas de Software(PSS) Baldoino F. dos S. Neto Propósito • “Converte a interface de uma classe em outra interface, esperada pelos clientes. O Adapter permite que classes com interfaces imcompatíveis trabalhem em conjunto – o que, de outra forma, seria impossível” © LES/PUC-Rio Motivação • Suponha que você tem um sistema que usa o componente A Interfaces compatíveis Componente A Seu sistema © LES/PUC-Rio Motivação • Porém o fornecedor do componente A faliu… • Você precisa utilizar o componente de outro fornecedor Componente A Seu sistema © LES/PUC-Rio Motivação • Porém, o fornecedor do componente B oferece uma interface incompatível com o seu sistema Interfaces incompatíveis Componente B Seu sistema © LES/PUC-Rio Motivação • Para não correr riscos, você cria um adaptador Interfaces compatíveis Seu sistema Sem alteração de código Adaptador Código novo © LES/PUC-Rio Interfaces compatíveis Componente B Sem alteração de código Aplicabilidade • Utilizamos quando: – Desejamos utilizar uma classe existente e sua interface não combina com o que precisamos; – Desejamos criar uma classe reutilizável que coopere com classes que apresentam interfaces incompatíveis. © LES/PUC-Rio Estrutura © LES/PUC-Rio Estrutura © LES/PUC-Rio Participantes • Target – Define a interface específica do domínio que o cliente utiliza. • Client – Interage com objetos de acordo com a interface Target. • Adaptee – Define uma interface existente que precisa ser adaptada. • Adapter – Adapta a interface de Adaptee para Target © LES/PUC-Rio Colaborações • Cliente invoca operações de Adaptee através de uma instância de Adapter. © LES/PUC-Rio Conseqüências • Class Adapter – Permite que Adapter substitua algum comportamento de Adaptee, uma vez que Adapter é uma subclasse de Adaptee; – Adapta Adaptee para Target através do uso efetivo de uma classe Adaptee concreta. Em conseqüência, um adaptador de classe não funcionará quando quisermos adaptar uma classe e todas as suas subclasses. • Object Adapter – Permite que um único Adapter trabalhe com vários Adaptee. Logo, Adapter pode acrescentar funcionalidade a todos os Adaptee de uma só vez; – Torna mais difícil redefinir um comportamento de Adaptee. Ele exigirá a criação de subclasses de Adaptee e fará com que Adapter referencie a subclasse ao invés de Adaptee em si. Exemplo © LES/PUC-Rio Exemplo Fim!!