<?xml version="1.0"?>
<rss version="2.0">
   <channel>
      <title>GRUPO 2. PATRONES ESTRUCTURALES by Lucy Faviola López</title>
      <link>https://padlet.com/faviolalopezacademico/estructurales</link>
      <description>Tipos de Patrones: Patrones Estructurales</description>
      <language>en-us</language>
      <pubDate>2021-02-19 01:34:13 UTC</pubDate>
      <lastBuildDate>2025-10-26 16:15:51 UTC</lastBuildDate>
      <webMaster>hello@padlet.com</webMaster>
      <image>
         <url>https://padlet.net/icons/png/1f320.png</url>
      </image>
      <item>
         <title>Patrones Estructurales</title>
         <author>carlospacheco8</author>
         <link>https://padlet.com/faviolalopezacademico/estructurales/wish/2111786785</link>
         <description><![CDATA[<div>Este tipo de patrones facilitan soluciones y estándares eficientes con respecto a las composiciones de clase y las estructuras de objetos. El concepto de herencia se utiliza para componer interfaces y definir formas de componer objetos para obtener nuevas funcionalidades.</div>]]></description>
         <enclosure url="" />
         <pubDate>2022-03-24 12:55:53 UTC</pubDate>
         <guid>https://padlet.com/faviolalopezacademico/estructurales/wish/2111786785</guid>
      </item>
      <item>
         <title>Patrones Estructurales </title>
         <author></author>
         <link>https://padlet.com/faviolalopezacademico/estructurales/wish/2111788584</link>
         <description><![CDATA[<div>Los patrones estructurales tratan la manera en que los objetos se conectan con otros objetos, para asegurar que los cambios del sistema no requieren cambiar esas conexiones.</div>]]></description>
         <enclosure url="" />
         <pubDate>2022-03-24 12:56:53 UTC</pubDate>
         <guid>https://padlet.com/faviolalopezacademico/estructurales/wish/2111788584</guid>
      </item>
      <item>
         <title></title>
         <author>carlospacheco8</author>
         <link>https://padlet.com/faviolalopezacademico/estructurales/wish/2111792438</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads.storage.googleapis.com/1641311136/3e6c8b5404c3e571f4b903f4b3d5e886/Pat.PNG" />
         <pubDate>2022-03-24 12:58:57 UTC</pubDate>
         <guid>https://padlet.com/faviolalopezacademico/estructurales/wish/2111792438</guid>
      </item>
      <item>
         <title>Funcion de los patrones estructurales</title>
         <author></author>
         <link>https://padlet.com/faviolalopezacademico/estructurales/wish/2111794169</link>
         <description><![CDATA[<div>Su función es determinar como las clases y objetos secombinan para formar estructuras. Estas estructuras permitirán que se agreguen nuevas funcionalidades</div>]]></description>
         <enclosure url="" />
         <pubDate>2022-03-24 12:59:53 UTC</pubDate>
         <guid>https://padlet.com/faviolalopezacademico/estructurales/wish/2111794169</guid>
      </item>
      <item>
         <title>Patrones Estructurales </title>
         <author>icekalol1</author>
         <link>https://padlet.com/faviolalopezacademico/estructurales/wish/2111797020</link>
         <description><![CDATA[<div>Los patrones estructurales se enfocan en como las clases y objetos se componen para formar estructuras mayores, los patrones estructurales describen como las estructuras compuestas por clases crecen para crear nuevas funcionalidades de manera de agregar a la estructura flexibilidad y que la misma pueda cambiar en tiempo de ejecución.</div>]]></description>
         <enclosure url="" />
         <pubDate>2022-03-24 13:01:18 UTC</pubDate>
         <guid>https://padlet.com/faviolalopezacademico/estructurales/wish/2111797020</guid>
      </item>
      <item>
         <title>Aplicabilidad del Bridge</title>
         <author>icekalol1</author>
         <link>https://padlet.com/faviolalopezacademico/estructurales/wish/2111823045</link>
         <description><![CDATA[<div>-Utiliza el patrón Bridge cuando quieras dividir y organizar una clase monolítica que tenga muchas variantes de una sola funcionalidad (por ejemplo, si la clase puede trabajar con diversos servidores de bases de datos).<strong><br>-</strong>Conforme más crece una clase, más difícil resulta entender cómo funciona y más tiempo se tarda en realizar un cambio. Cambiar una de las variaciones de funcionalidad puede exigir realizar muchos cambios a toda la clase, lo que a menudo provoca que se cometan errores o no se aborden algunos de los efectos colaterales críticos.<br>-El patrón Bridge te permite dividir la clase monolítica en varias jerarquías de clase. Después, puedes cambiar las clases de cada jerarquía independientemente de las clases de las otras. Esta solución simplifica el mantenimiento del código y minimiza el riesgo de descomponer el código existente.<br>-Utiliza el patrón Bridge cuando necesites poder cambiar implementaciones durante el tiempo de ejecución.<br>-Aunque es opcional, el patrón Bridge te permite sustituir el objeto de implementación dentro de la abstracción. Es tan sencillo como asignar un nuevo valor a un campo.</div>]]></description>
         <enclosure url="" />
         <pubDate>2022-03-24 13:14:18 UTC</pubDate>
         <guid>https://padlet.com/faviolalopezacademico/estructurales/wish/2111823045</guid>
      </item>
      <item>
         <title>Aplicabilidad del Decorator </title>
         <author>icekalol1</author>
         <link>https://padlet.com/faviolalopezacademico/estructurales/wish/2111831995</link>
         <description><![CDATA[<div>-Utiliza el patrón Decorator cuando necesites asignar funcionalidades adicionales a objetos durante el tiempo de ejecución sin descomponer el código que utiliza esos objetos.<br>-El patrón Decorator te permite estructurar tu lógica de negocio en capas, crear un decorador para cada capa y componer objetos con varias combinaciones de esta lógica, durante el tiempo de ejecución. El código cliente puede tratar a todos estos objetos de la misma forma, ya que todos siguen una interfaz común.<br>-Utiliza el patrón cuando resulte extraño o no sea posible extender el comportamiento de un objeto utilizando la herencia.<strong><br>-</strong>Muchos lenguajes de programación cuentan con la palabra clave final que puede utilizarse para evitar que una clase siga extendiéndose. Para una clase final, la única forma de reutilizar el comportamiento existente será envolver la clase con tu propio wrapper, utilizando el patrón Decorator.</div>]]></description>
         <enclosure url="" />
         <pubDate>2022-03-24 13:18:40 UTC</pubDate>
         <guid>https://padlet.com/faviolalopezacademico/estructurales/wish/2111831995</guid>
      </item>
      <item>
         <title>Composite</title>
         <author></author>
         <link>https://padlet.com/faviolalopezacademico/estructurales/wish/2111832760</link>
         <description><![CDATA[<div>&nbsp;Se utiliza cuando un componente del sistema puede ser un objeto individual o una colección de objetos.<br>Modela una estructura de árbol en donde un elemento tiene elementos del mismo tipo.<br>Una composición puede ser una colección de objetos en donde cada uno de estos objetos puede ser una composición o un objeto sencillo.</div>]]></description>
         <enclosure url="" />
         <pubDate>2022-03-24 13:19:00 UTC</pubDate>
         <guid>https://padlet.com/faviolalopezacademico/estructurales/wish/2111832760</guid>
      </item>
      <item>
         <title>Problema y solucion</title>
         <author>carlospacheco8</author>
         <link>https://padlet.com/faviolalopezacademico/estructurales/wish/2111834446</link>
         <description><![CDATA[<div>Problema<br>Tienes un objeto enorme que consume una gran cantidad de recursos del sistema. Lo necesitas de vez en cuando, pero no siempre.<br><br></div><div>Puedes llevar a cabo una implementación diferida, es decir, crear este objeto sólo cuando sea realmente necesario. Todos los clientes del objeto tendrán que ejecutar algún código de inicialización diferida. Lamentablemente, esto seguramente generará una gran cantidad de código duplicado.<br><br>Solución&nbsp;<br>El patrón Proxy sugiere que crees una nueva clase proxy con la misma interfaz que un objeto de servicio original. Después actualizas tu aplicación para que pase el objeto proxy a todos los clientes del objeto original. Al recibir una solicitud de un cliente, el proxy crea un objeto de servicio real y le delega todo el trabajo.<br>Al ejecutar algo antes o después de la lógica primaria de la clase, el proxy te permite hacerlo sin cambiar esa clase. Ya que el proxy implementa la misma interfaz que la clase original, puede pasarse a cualquier cliente que espere un objeto de servicio real.</div>]]></description>
         <enclosure url="" />
         <pubDate>2022-03-24 13:19:47 UTC</pubDate>
         <guid>https://padlet.com/faviolalopezacademico/estructurales/wish/2111834446</guid>
      </item>
      <item>
         <title>Aplicabilidad del Proxy</title>
         <author>carlospacheco8</author>
         <link>https://padlet.com/faviolalopezacademico/estructurales/wish/2111840149</link>
         <description><![CDATA[<div>Se lo aplica cuando:<br>Inicialización diferida (proxy virtual). Es cuando tienes un objeto de servicio muy pesado que utiliza muchos recursos del sistema al estar siempre funcionando, aunque solo lo necesites de vez en cuando.<br><br></div><div>En lugar de crear el objeto cuando se lanza la aplicación, puedes retrasar la inicialización del objeto a un momento en que sea realmente necesario.<br><br>Control de acceso (proxy de protección). Es cuando quieres que únicamente clientes específicos sean capaces de utilizar el objeto de servicio, por ejemplo, cuando tus objetos son partes fundamentales de un sistema operativo y los clientes son varias aplicaciones lanzadas (incluyendo maliciosas).<br><br></div><div>El proxy puede pasar la solicitud al objeto de servicio tan sólo si las credenciales del cliente cumplen ciertos criterios.<br><br></div><div>Ejecución local de un servicio remoto (proxy remoto). Es cuando el objeto de servicio se ubica en un servidor remoto.<br>En este caso, el proxy pasa la solicitud del cliente por la red, gestionando todos los detalles desagradables de trabajar con la red.<br><br></div><div><br><br></div>]]></description>
         <enclosure url="" />
         <pubDate>2022-03-24 13:22:22 UTC</pubDate>
         <guid>https://padlet.com/faviolalopezacademico/estructurales/wish/2111840149</guid>
      </item>
      <item>
         <title>Problema</title>
         <author></author>
         <link>https://padlet.com/faviolalopezacademico/estructurales/wish/2111840473</link>
         <description><![CDATA[<div>El uso del patrón Composite sólo tiene sentido cuando el modelo central de tu aplicación puede representarse en forma de árbol.<br><br></div><div>Por ejemplo, si se tiene dos tipos de objetos: Productos y Cajas. Una Caja puede contener varios Productos y un cierto número de Cajas más pequeñas. Estas Cajas pequeñas también pueden contener algunos Productos o incluso Cajas más pequeñas, y así sucesivamente.<br>Se decide crear un sistema de pedidos que utiliza estas clases. Los pedidos pueden contener productos sencillos sin envolver, así como cajas llenas de productos. y otras cajas.<br><br>SOLUCION<br>El patrón Composite sugiere que se trabaje con Productos y Cajas a través de una interfaz común que declara un método para calcular el precio total.<br>Un producto sencillamente devuelve su precio. Para una caja, recorre cada artículo que contiene la caja, pregunta su precio y devuelve un total por la caja. Si uno de esos artículos fuera una caja más pequeña, esa caja también comenzaría a repasar su contenido y así sucesivamente, hasta que se calcule el precio de todos los componentes internos. Una caja podría incluso añadir costos adicionales al precio final, como costos de empaquetado<br><br></div>]]></description>
         <enclosure url="" />
         <pubDate>2022-03-24 13:22:33 UTC</pubDate>
         <guid>https://padlet.com/faviolalopezacademico/estructurales/wish/2111840473</guid>
      </item>
      <item>
         <title>Aplicabilidad del Adapter</title>
         <author>icekalol1</author>
         <link>https://padlet.com/faviolalopezacademico/estructurales/wish/2111846662</link>
         <description><![CDATA[<div>-Utiliza la clase adaptadora cuando quieras usar una clase existente, pero cuya interfaz no sea compatible con el resto del código.<br>-El patrón Adapter te permite crear una clase intermedia que sirva como traductora entre tu código y una clase heredada, una clase de un tercero o cualquier otra clase con una interfaz extraña.<br>-Utiliza el patrón cuando quieras reutilizar varias subclases existentes que carezcan de alguna funcionalidad común que no pueda añadirse a la superclase.<br>-Puedes extender cada subclase y colocar la funcionalidad que falta, dentro de las nuevas clases hijas. No obstante, deberás duplicar el código en todas estas nuevas clases.</div>]]></description>
         <enclosure url="" />
         <pubDate>2022-03-24 13:25:32 UTC</pubDate>
         <guid>https://padlet.com/faviolalopezacademico/estructurales/wish/2111846662</guid>
      </item>
      <item>
         <title>Aplicabilidad del Flyweight</title>
         <author>icekalol1</author>
         <link>https://padlet.com/faviolalopezacademico/estructurales/wish/2111847960</link>
         <description><![CDATA[<div>-Utiliza el patrón Flyweight únicamente cuando tu programa deba soportar una enorme cantidad de objetos que apenas quepan en la RAM disponible.<br>-La ventaja de aplicar el patrón depende en gran medida de cómo y dónde se utiliza. Resulta más útil cuando:</div><ul><li>La aplicación necesita generar una cantidad enorme de objetos similares.</li><li>Esto consume toda la RAM disponible de un dispositivo objetivo.</li><li>Los objetos contienen estados duplicados que se pueden extraer y compartir entre varios objetos.</li></ul><div><br><br></div>]]></description>
         <enclosure url="" />
         <pubDate>2022-03-24 13:26:14 UTC</pubDate>
         <guid>https://padlet.com/faviolalopezacademico/estructurales/wish/2111847960</guid>
      </item>
      <item>
         <title>Estructura</title>
         <author></author>
         <link>https://padlet.com/faviolalopezacademico/estructurales/wish/2111851660</link>
         <description><![CDATA[<div>La interfaz <strong>Componente</strong> describe operaciones que son comunes a elementos simples y complejos del árbol.<br>La <strong>Hoja</strong> es un elemento básico de un árbol que no tiene subelementos.<br>Normalmente, los componentes de la hoja acaban realizando la mayoría del trabajo real, ya que no tienen a nadie a quien delegarle el trabajo.</div><div>El <strong>Contenedor</strong> (también llamado <em>compuesto</em>) es un elemento que tiene subelementos: hojas u otros contenedores. Un contenedor no conoce las clases concretas de sus hijos. Funciona con todos los subelementos únicamente a través de la interfaz componente.<br>Al recibir una solicitud, un contenedor delega el trabajo a sus subelementos, procesa los resultados intermedios y devuelve el resultado final al cliente.<br>El <strong>Cliente</strong> funciona con todos los elementos a través de la interfaz componente. Como resultado, el cliente puede funcionar de la misma manera tanto con elementos simples como complejos del árbol.</div><div><br></div>]]></description>
         <enclosure url="" />
         <pubDate>2022-03-24 13:28:02 UTC</pubDate>
         <guid>https://padlet.com/faviolalopezacademico/estructurales/wish/2111851660</guid>
      </item>
      <item>
         <title>Aplicabilidad del Facade</title>
         <author>carlospacheco8</author>
         <link>https://padlet.com/faviolalopezacademico/estructurales/wish/2111852539</link>
         <description><![CDATA[<div>Utiliza el patrón Facade cuando necesites una interfaz limitada pero directa a un subsistema complejo.<br><br></div><div>A menudo los subsistemas se vuelven más complejos con el tiempo. Incluso la aplicación de patrones de diseño suele conducir a la creación de un mayor número de clases. Un subsistema puede hacerse más flexible y más fácil de reutilizar en varios contextos, pero la cantidad de código de configuración que exige de un cliente, crece aún más. El patrón Facade intenta solucionar este problema proporcionando un atajo a las funciones más utilizadas del subsistema que mejor encajan con los requisitos del cliente.<br><br></div><div>Utiliza el patrón Facade cuando quieras estructurar un subsistema en capas.<br><br></div><div>Crea fachadas para definir puntos de entrada a cada nivel de un subsistema. Puedes reducir el acoplamiento entre v<br><br></div>]]></description>
         <enclosure url="" />
         <pubDate>2022-03-24 13:28:28 UTC</pubDate>
         <guid>https://padlet.com/faviolalopezacademico/estructurales/wish/2111852539</guid>
      </item>
      <item>
         <title>Codigo de la implementacion del proxy</title>
         <author>carlospacheco8</author>
         <link>https://padlet.com/faviolalopezacademico/estructurales/wish/2111891749</link>
         <description><![CDATA[<pre><strong>using</strong> System;

<strong>namespace</strong> <strong>RefactoringGuru</strong>.DesignPatterns.Proxy.Conceptual
{
    // The Subject interface declares common operations for both RealSubject and
    // the Proxy. As long as the client works with RealSubject using this
    // interface, you'll be able to pass it a proxy instead of a real subject.
    <strong>public</strong> <strong>interface</strong> <strong>ISubject</strong>
    {
        <strong>void</strong> Request();
    }
    
    // The RealSubject contains some core business logic. Usually, RealSubjects
    // are capable of doing some useful work which may also be very slow or
    // sensitive - e.g. correcting input data. A Proxy can solve these issues
    // without any changes to the RealSubject's code.
    <strong>class</strong> <strong>RealSubject</strong> : ISubject
    {
        <strong>public</strong> <strong>void</strong> Request()
        {
            Console.WriteLine("RealSubject: Handling Request.");
        }
    }
    
    // The Proxy has an interface identical to the RealSubject.
    <strong>class</strong> <strong>Proxy</strong> : ISubject
    {
        <strong>private</strong> RealSubject _realSubject;
        
        <strong>public</strong> Proxy(RealSubject realSubject)
        {
            <strong>this</strong>._realSubject = realSubject;
        }
        
        // The most common applications of the Proxy pattern are lazy loading,
        // caching, controlling the access, logging, etc. A Proxy can perform
        // one of these things and then, depending on the result, pass the
        // execution to the same method in a linked RealSubject object.
        <strong>public</strong> <strong>void</strong> Request()
        {
            <strong>if</strong> (<strong>this</strong>.CheckAccess())
            {
                <strong>this</strong>._realSubject.Request();

                <strong>this</strong>.LogAccess();
            }
        }
        
        <strong>public</strong> <strong>bool</strong> CheckAccess()
        {
            // Some real checks should go here.
            Console.WriteLine("Proxy: Checking access prior to firing a real request.");

            <strong>return</strong> <strong>true</strong>;
        }
        
        <strong>public</strong> <strong>void</strong> LogAccess()
        {
            Console.WriteLine("Proxy: Logging the time of request.");
        }
    }
    
    <strong>public</strong> <strong>class</strong> <strong>Client</strong>
    {
        // The client code is supposed to work with all objects (both subjects
        // and proxies) via the Subject interface in order to support both real
        // subjects and proxies. In real life, however, clients mostly work with
        // their real subjects directly. In this case, to implement the pattern
        // more easily, you can extend your proxy from the real subject's class.
        <strong>public</strong> <strong>void</strong> ClientCode(ISubject subject)
        {
            // ...
            
            subject.Request();
            
            // ...
        }
    }
    
    <strong>class</strong> <strong>Program</strong>
    {
        <strong>static</strong> <strong>void</strong> Main(<strong>string</strong>[] args)
        {
            Client client = <strong>new</strong> Client();
            
            Console.WriteLine("Client: Executing the client code with a real subject:");
            RealSubject realSubject = <strong>new</strong> RealSubject();
            client.ClientCode(realSubject);

            Console.WriteLine();

            Console.WriteLine("Client: Executing the same client code with a proxy:");
            Proxy proxy = <strong>new</strong> Proxy(realSubject);
            client.ClientCode(proxy);
        }
    }
}</pre><div><br></div>]]></description>
         <enclosure url="" />
         <pubDate>2022-03-24 13:46:55 UTC</pubDate>
         <guid>https://padlet.com/faviolalopezacademico/estructurales/wish/2111891749</guid>
      </item>
      <item>
         <title></title>
         <author>icekalol1</author>
         <link>https://padlet.com/faviolalopezacademico/estructurales/wish/2111909452</link>
         <description><![CDATA[<pre>// Digamos que tienes dos clases con interfaces compatibles:
// RoundHole (HoyoRedondo) y RoundPeg (PiezaRedonda).
<strong>class</strong> <strong>RoundHole</strong> <strong>is</strong>
    <strong>constructor</strong> RoundHole(radius) { ... }

    <strong>method</strong> getRadius() <strong>is</strong>
        // Devuelve el radio del agujero.

    <strong>method</strong> fits(peg: RoundPeg) <strong>is</strong>
        <strong>return</strong> <strong>this</strong>.getRadius() &gt;= peg.getRadius()

<strong>class</strong> <strong>RoundPeg</strong> <strong>is</strong>
    <strong>constructor</strong> RoundPeg(radius) { ... }

    <strong>method</strong> getRadius() <strong>is</strong>
        // Devuelve el radio de la pieza.


// Pero hay una clase incompatible: SquarePeg (PiezaCuadrada).
<strong>class</strong> <strong>SquarePeg</strong> <strong>is</strong>
    <strong>constructor</strong> SquarePeg(width) { ... }

    <strong>method</strong> getWidth() <strong>is</strong>
        // Devuelve la anchura de la pieza cuadrada.


// Una clase adaptadora te permite encajar piezas cuadradas en
// hoyos redondos. Extiende la clase RoundPeg para permitir a
// los objetos adaptadores actuar como piezas redondas.
<strong>class</strong> <strong>SquarePegAdapter</strong> <strong>extends</strong> RoundPeg <strong>is</strong>
    // En realidad, el adaptador contiene una instancia de la
    // clase SquarePeg.
    <strong>private</strong> <strong>field</strong> peg: SquarePeg

    <strong>constructor</strong> SquarePegAdapter(peg: SquarePeg) <strong>is</strong>
        <strong>this</strong>.peg = peg

    <strong>method</strong> getRadius() <strong>is</strong>
        // El adaptador simula que es una pieza redonda con un
        // radio que pueda albergar la pieza cuadrada que el
        // adaptador envuelve.
        <strong>return</strong> peg.getWidth() * Math.sqrt(2) / 2


// En algún punto del código cliente.
hole = <strong>new</strong> RoundHole(5)
rpeg = <strong>new</strong> RoundPeg(5)
hole.fits(rpeg) // verdadero

small_sqpeg = <strong>new</strong> SquarePeg(5)
large_sqpeg = <strong>new</strong> SquarePeg(10)
hole.fits(small_sqpeg) // esto no compila (tipos incompatibles)

small_sqpeg_adapter = <strong>new</strong> SquarePegAdapter(small_sqpeg)
large_sqpeg_adapter = <strong>new</strong> SquarePegAdapter(large_sqpeg)
hole.fits(small_sqpeg_adapter) // verdadero
hole.fits(large_sqpeg_adapter) // falso</pre><div><br></div>]]></description>
         <enclosure url="" />
         <pubDate>2022-03-24 13:54:58 UTC</pubDate>
         <guid>https://padlet.com/faviolalopezacademico/estructurales/wish/2111909452</guid>
      </item>
   </channel>
</rss>
