El patrón FACADE o Fachada
El objetivo principal del patrón de diseño FACADE en PHP es el de simplificar nuestro sistema gracias a que permite exponer una interfaz mas amigable y fácil de digerir sin necesidad de conocer a fondo cada uno de los sub sistemas que se agrupan en esta “fachada”.
Para tratar de entender mejor el concepto, veamos un diagrama para visualizar mejor el patrón FACADE:
Aquí podemos ver que tenemos 3 subsistemas el cual son la clase Twitter, Instagram y Facebook, el cual cuya funcionalidad puede ser agrupada en la clase FACADE que hemos llamado: SocialNetworksClass quien posteriormente sera utilizada por cualquier clase de servicio.
Continuando con lo presentado en el diagrama, te muestro un ejemplo de código:
Ejemplo de implementación del Patrón de diseño FACADE en PHP
interface SocialNetworksInterface
{
public function publish();
public function follow();
public function unfollow();
public function addLike();
public function retweet();
}
interface TwitterAPIClientInterface
{
public function tweet();
public function follow();
public function unfollow();
public function addLike();
public function retweet();
}
interface InstagramAPIClientInterface
{
public function publish();
public function follow();
public function unfollow();
public function addLike();
}
interface FacebookAPIClientInterface
{
public function addPost();
public function addLike();
}
class SocialNetworks implements SocialNetworksInterface
{
/**
* @var TwitterAPIClientInterface
*/
protected $twitterApiClient;
/**
* @var InstagramAPIClient
*/
protected $instagramApiClient;
/**
* @var FacebookAPIClient
*/
protected $facebookApiClient;
public function __construct(
TwitterAPIClientInterface $twitterApiClient,
InstagramAPIClientInterface $instagramApiClient,
FacebookAPIClientInterface $facebookApiClient
) {
}
public function publish()
{
$this->twitterApiClient->tweet();
$this->instagramApiClient->publish();
$this->facebookApiClient->addPost();
}
public function follow()
{
$this->twitterApiClient->follow();
$this->instagramApiClient->follow();
}
public function unfollow()
{
$this->twitterApiClient->unfollow();
$this->instagramApiClient->unfollow());
}
public function addLike()
{
$this->twitterApiClient->addLike();
$this->instagramApiClient->addLike();
$this->facebookApiClient->addLike();
}
public function retweet()
{
$this->twitterApiClient->retweet();
}
}
class TwitterAPIClient implements TwitterAPIClientInterface
{
public function tweet()
{
// tweet() method implementation
}
public function follow()
{
// follow() method implementation
}
public function unfollow()
{
// unfollow() method implementation
}
public function addLike()
{
// addLike() method implementation
}
public function retweet()
{
// retweet() method implementation
}
}
class InstagramAPIClient implements InstagramAPIClientInterface
{
public function publish()
{
// publich() method implementation
}
public function follow()
{
// follow() method implementation
}
public function unfollow()
{
// unfollow() method implementation
}
public function addLike()
{
// addLike() method implementation
}
}
class FacebookAPIClient implements FacebookAPIClientInterface
{
public function addPost()
{
// addPost() method implementation
}
public function addLike()
{
// addLike() method implementation
}
}
El ejemplo que expongo es a manera ilustrativa de cómo implementar el patrón de diseño FACADE en tus proyectos.
En el ejemplo expuesto se puede apreciar como toda la funcionalidad de tres sub sistemas, Twitter, Facebook e Instagram, quedan envueltas en una clase FACHADA o FACADE.
Esto permite simplificar radicalmente la implementación de uno o varios sub sistemas en clases de servicios o en cualquier otro punto donde sea requerido.
Ademas que la clase que implementa nuestra clase FACADE no necesita saber internamente cómo funciona cada sub sistema.
Recuerda que si tienes alguna sugerencia o pregunta, no dudes en dejar tus comentarios al final del post.
Si te gustó este post, ayúdame a que pueda servirle a muchas más personas, compartiendo mis contenidos en tus redes sociales.
Espero que este post haya sido de gran ayuda para ti, y como siempre, cualquier inquietud o duda que tengas, puedes contactarme por cualquiera de las vías disponibles, o dejando tus comentarios al final de este post.
También puedes sugerir que temas o post te gustaría leer a futuro.