PHP: objetos compuestos, cómo usar el patrón Composite

2022-02-02 - Categorías: General / PHP / Principios y patrones
Pieces, design patterns, principles, patrones de diseño

Siguiendo con la recopilación de codekatas sobre patrones del diseño software llegamos al patrón Composite. Este patrón es una forma de reutilizar código fuente, haciendo objetos que sean compuestos de otros, como su nombre indica.

Estos conceptos se pueden usar por ejemplo en las ventas que pueden ser combinaciones de varias ventas, en figuras geométricas compuestas, en aplicación de reglas de precios, productos simples o compuestos, etc.. Por ejemplo, aplicando descuentos, puede ser que tengamos descuentos simples y descuentos que puedan ser la acumulación de otros varios. Un producto puede ser simple, o puede ser un pack de una combinación de otros productos. Una figura puede ser simple, o puede ser una combinación de varias figuras simples. Y así suma y sigue según el escenario en curso..

Cómo se traduce el patrón Composite en códigos fuentes PHP

La idea es la misma sea el lenguaje de programación que sea. Pero se traduce en algo como lo siguiente:

Por ejemplo, una interfaz que simplemente define que tenemos un contrato de uso que nos obliga a implementar la función printFeatures(). Y dos clases Something y SomethingComposed que implementan la interfaz.

Al grano, es más fácil verlo en el fuente..

<?php

interface ISomething
{
    public function printFeatures();
}
<?php

class Something implements ISomething
{
    public function printFeatures()
    {
        echo 'Here we print the features '.PHP_EOL;
    }
}
<?php

class SomethingComposed implements ISomething
{
    private $somethings = [];

    public function addSomething(Something $something)
    {
        $this->somethings[] = $something;
    }

    public function printFeatures()
    {
        foreach ($this->somethings as $something) {
            $something->printFeatures();
        }
    }
}

El objeto SomethingComposed aplica el patrón Composite.

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.