definición
El modo adaptador (adaptador) es convertir una interfaz (método o atributo) de una clase (objeto) en otra interfaz (método o atributo) que el cliente desea. El modo adaptador permite esas clases (objetos) que originalmente no pudieron trabajar juntos debido a la incompatibilidad de la interfaz. Envoltura rápida.
El alias para el adaptador es un envoltorio, que es un patrón relativamente simple. Hay muchos de estos escenarios en el desarrollo del programa: cuando intentamos llamar a una interfaz de un módulo u objeto, encontramos que el formato de esta interfaz no cumple con los requisitos actuales. Hay dos soluciones en este momento. El primero es modificar la implementación de la interfaz original, pero si el módulo original es muy complicado, o el módulo que obtenemos es un código comprimido escrito por otra persona, modificar la interfaz original será poco realista. El segundo método es crear un adaptador y convertir la interfaz original en otra interfaz que el cliente desea. El cliente solo necesita lidiar con el adaptador.
¿Por qué necesitas usar el modo adaptador?
Al desarrollar una aplicación, a menudo necesita reemplazar una parte de ella, por ejemplo, una biblioteca que usa para contener registros o contenido similar. Cuando lo reemplaza con una nueva biblioteca, es poco probable que la nueva biblioteca tenga exactamente la misma interfaz. Desde aquí, tienes dos opciones:
(1) Verifique todo el código y cambie todo el código que apunte a la biblioteca anterior.
(2) Cree un adaptador para que la nueva biblioteca pueda usar la misma interfaz que la biblioteca anterior.
Obviamente, en algunos casos, si su aplicación es pequeña, o hay pocas referencias a la biblioteca anterior, es más apropiado verificar el código completo y cambiarlo para que coincida con la nueva biblioteca en lugar de agregar una nueva capa de abstracción para que el código sea más complicado. Sin embargo, en la mayoría de los casos, crear un adaptador es más práctico y ahorra tiempo.
Ejemplos de código JavaScript
Cuando algo puede suceder, definitivamente sucederá. Primero echemos un vistazo a esta pequeña LoggerFactory, que nos permite modificar la interfaz de registro que usamos más fácilmente.
var loggerFactory = {getLogger: function () {return window.console; }, ...};/* Ejemplo de uso*/var logger = loggerFactory.getLogger (); logger.log ("algo a log");Cuando llamamos a GetLogger, nos devuelve el objeto de la consola (consola). Para este ejercicio, pretendemos que el objeto de la consola solo tiene un método: registrar y solo puede recibir un parámetro de tipo de cadena. A continuación, tenemos otra interfaz de registro, que será más complicada porque 1) se implementa en JavaScript, a diferencia de la consola, que no es el navegador en sí; 2) Enviará los registros al servidor a través de AJAX, lo que también significa que tenemos que codificar los datos de URL (el código no implementará específicamente los asuntos relacionados con la codificación de URL, porque no tiene nada que ver con el patrón del adaptador del que queremos hablar). Por supuesto, utilizará una interfaz diferente de la consola.
var ajaxLogger = {sendLog: function () {var data = this.urlencode (argumentos); jQuery.AJAX ({url: "http://example.com/log", Data: Data}); }, urlencode: function (arg) {... return encodedData; }, ...};Utilizamos las solicitudes AJAX de JQuery, principalmente para ahorrar tiempo e ignorar las cosas que no queremos hacer con el modo adaptador. Lo que tenemos que hacer ahora es crear un adaptador y cambiar la LoggerFactory anterior para devolver este adaptador en lugar del objeto de consola.
var ajaxLoggerAdapter = {log: function (arg) {ajaxLogger.sendLog (arg); }};/ * Ajustar loggerFactory */var loggerFactory = {getLogger: function () {// Cambia el valor de retorno return aJaxLoggerAdapter; }, ...};Solo hicimos una línea de cambios en el código existente, y todo el programa puede usar esta nueva interfaz de registro.
Adaptador complejo
La interfaz de registro es un ejemplo muy simple. Solo tiene un método, y no es difícil mapearlo directamente al método anterior. Este no es el caso en la mayoría de los casos. Puede encontrar el problema de que los parámetros de estas funciones mapeadas son completamente diferentes, y la interfaz anterior puede no tener estos parámetros en absoluto, y debe lidiar con ellas usted mismo. En algunos casos, debe eliminar algunos parámetros porque las nuevas interfaces no los usan en absoluto. Si el mapeo de la interfaz entre dos objetos es demasiado difícil, tenemos que pensar en otras formas, de todos modos, no quiero encontrar y modificar miles de líneas de código antiguo.