PHP: cómo implementar el patrón de diseño Proxy

2022-02-16 - Categorías: General / PHP / Principios y patrones

En el patrón de diseño del software Proxy, se incluye una clase intermedia antes de un objeto, para aplicar acciones extra antes de usar el objeto intermediado.

Es decir, es para aplicar acciones como cacheado de la información, de los objetos generados, logs, reenvío de acciones a otros objetos, control de acceso a métodos o datos, etcétera..

Al grano, show me the code

Supongamos que queremos cachear el uso de la clase Something con un Proxy. Una forma es implementar algo parecido a lo siguiente:

Simplemente se delega la creación del objeto Something, y la llamada al método doSomething que es el objetivo para hacer todo esto. Lo siguiente es que se cachea la respuesta al método doSomething dentro del objeto ProxyForSomething, este es el porqué se ha metido el proxy, haciendo que sólo se procese la función del objeto Something una sola vez en vez de tres veces.

El código del cliente que usa el proxy:

<?php

include 'ISomething.php';
include 'Something.php';
include 'ProxyForSomething.php';

(new Client())->main();

class Client
{
    public function main()
    {
        $proxy = new ProxyForSomething('Something');

        echo $proxy->doSomething().PHP_EOL;
        echo $proxy->doSomething().PHP_EOL;
        echo $proxy->doSomething().PHP_EOL;
    }
}

La implementación de la interfaz que define contrato de uso:

<?php

interface ISomething
{
    public function doSomething();
}

El objeto cacheado:

<?php

class Something implements ISomething
{
    public function doSomething()
    {
        /*
         * Here goes code for something to do..
         */

        return 'Say something..';
    }
}

Y finalmente el proxy que implementa las mismas funciones que el objeto cacheado:

<?php

class ProxyForSomething implements ISomething
{
    private $instance;
    private $returnCached;

    public function __construct($className)
    {
        $this->instance = new $className();
    }

    /**
     * For instance, this proxy wants to cache the returned string..
     */
    public function doSomething()
    {
        if (empty($this->returnCached)) {
            $this->returnCached = $this->instance->doSomething();
        }

        return $this->returnCached;
    }
}

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

 

© 2022 JnjSite.com - MIT license

Sitio hecho con WordPress, diseño y programación del tema por Jnj.