definição
O modo adaptador (adaptador) deve converter uma interface (método ou atributo) de uma classe (objeto) em outra interface (método ou atributo) que o cliente deseja. O modo adaptador permite que as classes (objetos) originalmente não pudessem trabalhar juntos devido à incompatibilidade da interface. Invólucro rápido.
O alias para o adaptador é um invólucro, que é um padrão relativamente simples. Existem muitos cenários no desenvolvimento do programa: quando tentamos chamar uma interface de um módulo ou objeto, descobrimos que o formato dessa interface não atende aos requisitos atuais. Existem duas soluções neste momento. O primeiro é modificar a implementação original da interface, mas se o módulo original for muito complicado, ou o módulo que obtemos for um código compactado escrito por outra pessoa, a modificação da interface original não será realista. O segundo método é criar um adaptador e converter a interface original em outra interface que o cliente deseja. O cliente só precisa lidar com o adaptador.
Por que você precisa usar o modo adaptador?
Ao desenvolver um aplicativo, geralmente você precisa substituir uma parte dele, por exemplo, uma biblioteca que você usa para manter logs ou conteúdo semelhante. Quando você o substitui por uma nova biblioteca, é improvável que a nova biblioteca tenha exatamente a mesma interface. A partir daqui, você tem duas opções:
(1) Verifique todo o código e altere todo o código apontando para a biblioteca antiga.
(2) Crie um adaptador para que a nova biblioteca possa usar a mesma interface que a biblioteca antiga.
Obviamente, em alguns casos, se o seu aplicativo for pequeno ou houver poucas referências à biblioteca antiga, é mais apropriado verificar o código completo e alterá -lo para corresponder à nova biblioteca em vez de adicionar uma nova camada de abstração para tornar o código mais complicado. No entanto, na maioria dos casos, a criação de um adaptador é mais prática e economiza tempo.
Exemplos de código JavaScript
Quando algo pode acontecer, isso definitivamente acontecerá. Primeiro, vamos dar uma olhada nesse pequeno LoggerFactory, que nos permite modificar a interface de log que usamos com mais facilidade.
var loggerFactory = {getLogger: function () {return window.console; }, ...};/* Exemplo de uso*/var Logger = LoggerFactory.getLogger (); Logger.log ("Algo a Log");Quando chamamos o GetLogger, ele nos devolve o objeto de console (console). Para este exercício, fingimos que o objeto de console possui apenas um método - log e só pode receber um parâmetro de tipo de sequência. Em seguida, temos outra interface de log, que será mais complicada porque 1) é implementada em JavaScript, diferentemente do console, que não é o próprio navegador; 2) Ele enviará os logs para o servidor através do AJAX, o que também significa que precisamos codificar os dados da URL (o código não implementará especificamente os assuntos relacionados à codificação de URL, porque não tem nada a ver com o padrão adaptador que queremos falar). Obviamente, ele usará uma interface diferente do console.
var ajaxLogger = {sendLog: function () {var data = this.urlencode (argumentos); jQuery.ajax ({url: "http://example.com/log", dados: dados}); }, urlencode: function (arg) {... return codedData; }, ...};Usamos as solicitações do JQuery Ajax, principalmente para economizar tempo e ignorar as coisas que não queremos fazer com o modo adaptador. O que precisamos fazer agora é criar um adaptador e alterar o LoggerFactory anterior para retornar este adaptador em vez do objeto do console.
var ajaxLoggerAdapter = {log: function (arg) {ajaxlogger.sendLog (arg); }};/ * Ajuste o LoggerFactory */var LoggerFactory = {getLogger: function () {// altere o valor de retorno retornar ajaxloggeradapter; }, ...};Fizemos apenas uma linha de alterações no código existente e todo o programa pode usar essa nova interface de log.
Adaptador complexo
A interface de log é um exemplo muito simples. Ele possui apenas um método e não é difícil mapeá -lo diretamente para o método antigo. Este não é o caso na maioria dos casos. Você pode encontrar o problema de que os parâmetros dessas funções mapeados são completamente diferentes, e a interface antiga pode não ter esses parâmetros, e você precisa lidar com eles você mesmo. Em alguns casos, você deve excluir alguns parâmetros porque novas interfaces não as usam. Se o mapeamento da interface entre dois objetos for muito difícil, temos que pensar em outras maneiras, de qualquer maneira, não quero encontrar e modificar milhares de linhas de código antigo.