Skip to main content

Command Palette

Search for a command to run...

Patrón de diseño FACADE en PHP

Published
3 min read
Patrón de diseño FACADE en PHP
F

Actualmente llevo más de 15 años en el mundo del desarrollo de software, siempre me he dedicado a mantenerme al día con todo lo relacionado a internet y el mundo de los dispositivos móviles. Soy fiel creyente de que el futuro esta en la Web. Amo la tecnología, creo que es mi mayor adicción.

Siempre me he considerado un Tech-Lover y en especial de las últimas tecnologías. Soy partidario de que en este mundo no podemos quedarnos atrás por lo que siempre hay que estar innovando y evolucionando en esta rama. Gracias a esto es que mi afán siempre ha sido el de mantenerme al día con todo lo que a tecnología se refiere.

Con el tiempo, me he dado cuenta de la importancia de las arquitecturas de software, los principios de la programación orientada a objetos y por supuesto, los patrones de diseño. Es por esto en los últimos años me he vuelto adicto a las arquitecturas de software por lo que podrás encontrar bastante información teórica y práctica en mi blog.

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.

More from this blog

F

Francisco Ugalde

47 posts

Software Engineer, amante de la tecnología, la arquitectura de software y de compartir tips y contenido de valor. Siéntete libre de contactarme vía email ó Twitter.