Patrón de diseño del adaptador: Adapte todo con sus códigos

Cuando empezamos a construir software, podemos ver muchas incompatibilidades de código. Por ejemplo, en un método el tipo de argumento para un usuario es un número entero (user ID) y en otro método, un tipo de argumento es un objeto de clase (User class object).

¿Qué es el patrón de diseño del adaptador?

El patrón de diseño del adaptador/envoltura es uno de los más prácticos y útiles que se ha utilizado en muchos casos. Cuando tienes dos interfaces incompatibles en tus clases puedes usar el patrón de adaptador, o cuando quieres usar algún paquete de terceros en tu proyecto, la mejor práctica es envolver ese paquete en una clase de adaptador/envoltura. De hecho, el patrón de diseño del adaptador convierte los contratos externos a su contrato y de esta manera, no hay necesidad de cambiar los contratos en cada lado.Desafortunadamente he visto a muchos desarrolladores cambiar el código fuente de un paquete de terceros para hacerlo compatible con su código y no consideran el hecho de que están violando los principios de SOLID.si ese propietario de terceros quiere tener alguna actualización para ese paquete y usted perdió todos los códigos de overrode, entonces ¿cuál es la solución?

Hablar es barato, muéstrame el código.

Imagine que hay una clase Purchase Service que necesita un objeto de clase User and Order para realizar y completar una compra y esta clase se ha utilizado en muchos otros códigos y todos ellos proporcionan objetos User and Order a esta clase.

namespaceAppServicesPurchase;
classServicio de Compra{
/**
* instancia de clase de usuario
*
* @var AppModelsUser
*/usuario privado $usuario;
/**
* ejemplo de clase de orden
*
* @var AppModelsOrder
*/ Orden privada $;
/**
* hacer una instancia de la clase
*
* @retorno void
*/Función pública__construct(Usuario $usuario, Pedido $orden){
$this->user = $user;
$this->pedido;
}
Supongamos que hay un método en un controlador específico que necesita una clase de servicio de compra y sólo puede proporcionar un ID de usuario y un ID de orden.

  1. convertir ese ID de usuario y el ID de pedido en sus objetos relativos.
  2. poner alguna condición en nuestra clase de Servicio de Compras para comprobar que los argumentos son un ID o un objeto.
  3. utilizar una clase Adaptador para adaptar esta incompatibilidad.
  4. Convertir el ID de usuario o el ID de pedido en un objeto es la forma más sencilla, pero obliga a una responsabilidad extra a la clase del controlador o a cualquier otra clase que quiera hacer lo mismo, por lo que este método es irracional, por lo que poner algunas condiciones en nuestra clase de Servicio de Compras lleva a escribir muchas frases if-else o switch y no es una forma optimizada de lograr nuestro objetivo. Después de un tiempo, si queremos proporcionar algún otro tipo de datos como el correo electrónico para los usuarios y el número de reserva de pedido para el Servicio de Compras, entonces necesitamos más declaraciones de "si otro", y la forma final es usar el patrón del Adaptador, podemos hacer una clase de Adaptador que convierta ese ID de usuario y el ID de pedido en el objeto correspondiente y luego pasarlos al servicio de compras.

    namespaceAppServicesCompras;
    classCompraServicioAdaptador{
    /**
    * ejemplo de servicio de compra
    *
    * @var Appservices @var Appservices @PurchasePurchaseService
    */Servicio de compra privada;
    publicfunction__construct(int $userID, int $orderID){
    $user = Usuario::find($userID);
    Pedido = Pedido::find($orderID);
    esto->servicio de compra= nuevo servicio de compra ($usuario, $pedido);
    }
    /**
    * obtener instancia de servicio de compra
    *
    * @retorno void
    */publicfunctiongetPurchaseService(){
    return$this->servicio de compra;
    }
    Así que, en cualquier lugar que tenga datos basados en el ID de usuario y el ID de pedido, puede utilizar este adaptador y obtener fácilmente un objeto real de la clase de servicio de compra.

    Patrón de adaptador como envoltura

    Este es un caso especial de usar el patrón de diseño del adaptador para envolver algunas clases u objetos y luego proveerlo para otras secciones del código, en este caso, imagina que hemos usado un paquete de terceros en nuestro proyecto y que ha sido usado en muchos lugares diferentes y después de un tiempo, queremos reemplazarlo por otro. Por ejemplo, el paquete actual ha quedado obsoleto o su creador ya no tiene ningún plan para actualizarlo. En esta situación, el otro lado del patrón del adaptador que significa que el patrón de la envoltura puede ayudarnos.

    Ejemplo del mundo real de un patrón de envoltura

    en este ejemplo, supongamos que hemos usado GuzzleHttp como manejador de peticiones HTTP para nuestro proyecto. Para prevenir este desastre podemos hacer una clase de envoltura para este cliente y decirle a cada desarrollador que contribuya al proyecto que use esta clase de envoltura en lugar de usar GuzzleHttp directamente en sus códigos.

    namespaceAppHandlersHttp;
    usePsrHttpMessageResponseInterface;
    classHttpHandler{
    /**
    * instancia del handler
    *
    * @var $handler
    */private $handler;
    /**
    * hacer instancia de clase
    *
    * @retorno void
    */función pública__construct(){(1)
    Este->manipulador = nuevo GuzzleHttpCliente([
    base_uri => `la url de su api base,
    ]);
    }
    /**
    * manejar las solicitudes GET
    *
    * @param string $endpoint
    * @retorno ResponseInterface
    */publicfunctionget(string $endpoint){
    return$this->handler->get($punto final);
    }
    /**
    * manejar las peticiones POST
    *
    * @param string $endpoint
    * @param array $params
    * @retorno ResponseInterface
    */publicfunctionpost(string $endpoint, array $params){
    return$this->handler->post($punto final, [ [])
    cuerpo => $params
    ]);
    }
    En el ejemplo anterior, sólo se pueden ver los métodos get y post, pero en la solución completa, se deben proporcionar otros manejadores de verbos HTTP, se puede ver un ejemplo simple de uso de esta clase en otras clases a continuación;
    UseAppHandlersHttpHttpHttpHandler;
    classUsuariosControlador{
    /**
    * instinto de httpClient
    *
    * @var HttpHandler
    */privado $httpClient;
    /**
    * make instnace of class
    *
    * @retorno void
    */función pública__construct(){(1)
    Esto->httpClient = nuevo HttpHandler();
    }
    /**
    * conseguir que todos los usuarios
    *
    * @retorno void
    */publicfunctiongetAllUsers(){
    Respuesta = $this->httpClient->get(usuarios);
    }
    Espero que este artículo le ayude a comprender mejor el patrón Adaptador/Envoltura y que esté dispuesto a usarlo en sus proyectos.

Etiquetas

Patrones de diseñoLaravelAdaptador Patrón de diseñoNuevas historias técnicasDiseño de códigoCodificaciónPatrón de adaptador como envolturaEjemplo de envoltura de patrón

Comentarios

Continúe la discusión