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