Yo estaba mirando el Proxy Patrón, y a mí me parece un montón de cosas como el Decorador, el Adaptador y el Puente de los patrones. Estoy malentendido algo? ¿Cuál es la diferencia? ¿Por qué utilizar el Proxy patrón frente a los demás? ¿Cómo se han usado en el pasado en el mundo real de los proyectos?

  • A menudo hay patrones que parecen muy similares, pero difieren en su intención (la estrategia y el estado de los patrones vienen a la mente). Creo que esto es a menudo debido al hecho de que los patrones de diseño están basados en sólidos comunes principios de diseño.
  • Así, estos cuatro patrones tienen exactamente los mismos detalles de la implementación. Estado de los versículos de la Estrategia de al menos puede ser resumido como el estado completo de versos apátridas (la mayor parte). A menudo, la Estrategia es sólo el método de inyección, donde el estado patrón utiliza una interfaz para hacer más abstracto de distancia de una llamada de método. La estrategia, además, al final del día, es un hack para permitir la programación funcional en la OO mundo.
  • podrías SER más claro ? 😛

13 Comentarios

  1. 624

    Proxy, Decorador, el Adaptador y el Puente de variaciones sobre el «ajuste» de una clase. Pero sus usos son diferentes.

    • Proxy podría ser utilizado cuando se desea perezoso-crear instancias de un objeto, o de ocultar el hecho de que usted está llamando a un servicio remoto, o control de acceso al objeto.

    • Decorador también es llamado el «Proxy Inteligente.» Esto se utiliza cuando se desea agregar funcionalidad a un objeto, pero no por extender ese tipo de objeto. Esto le permite hacerlo en tiempo de ejecución.

    • Adaptador de se utiliza cuando se tiene una interfaz abstracta, y a los que desee asignar la interfaz para otro objeto que tiene la misma función, pero con una interfaz diferente.

    • Puente es muy similar a la del Adaptador, pero la llamamos Puente al definir tanto el resumen de la interfaz y la implementación subyacente. I. e. no está adaptando a algún legado o código de terceros, usted es el diseñador de todo el código, pero usted necesita ser capaz de intercambiar diferentes implementaciones.

    • Fachada es de un nivel superior (lea: más simple) de la interfaz para un subsistema de una o más clases. Supongamos que usted tiene un concepto complejo que requiere de múltiples objetos a representar. Hacer cambios para el conjunto de objetos es confuso, porque no siempre se sabe qué objeto tiene el método que usted necesita llamar. Ese es el tiempo para escribir una Fachada que proporciona un alto nivel de métodos para todas las operaciones complejas que usted puede hacer para la colección de objetos. Ejemplo: un Modelo de Dominio para una escuela de sección, con métodos como countStudents(), reportAttendance(), assignSubstituteTeacher(), y así sucesivamente.

    • Buena respuesta. Puede ser vale la pena agregar algunos ejemplos de donde usted lo ve en la naturaleza? e.g las clases de Proxy de Servicios Web. +1 de mí.
    • gracias, pero prefiero seguir esta respuesta corta y dulce. Me animo a escribir otra respuesta con ejemplos en la naturaleza!
    • La mejor manera de agregar funcionalidad a un objeto es extender su tipo, al menos en C++. Por lo que su definición de Decorador no está muy claro para mí. ¿Qué significa?
    • usted no puede extender una clase de C++ sin escribir nuevo código y compilarlo. Pero un Decorador de clase puede aplicar funciones suplementarias para una clase de C++ en tiempo de ejecución.
    • Decorador también es bueno para evitar el fuera de control tipo de jerarquías. Por ejemplo, supongamos que tenemos una ventana en una interfaz gráfica de usuario y desea tener opcional barras de desplazamiento. Usted podría tener Ventana, VScrollWindow, HScrollWindow, y VHScrollWindow clases o usted podría hacer VScroll y propiedades hscroll decoradores en la Ventana.
    • sí, buen punto! Tipo de jerarquías tienen que ser los árboles. Con Decoradores, podemos agregar la funcionalidad de una manera más flexible.
    • Mismo para el Decorador… se requiere un nuevo código, pero sólo utiliza la composición de lugar de la herencia. No se puede agregar el código en tiempo de ejecución (no en C++), el código tiene que ser por escrito, y volver a compilar.
    • Mirando hacia atrás en mi comentario de hace un año, no estoy muy seguro de lo que yo estaba tratando de decir (lol) pero no me defensor de la herencia para todo. Tiene que haber una fuerte relación para que tenga sentido, de lo contrario tienden a preferir composición/agregación.
    • Decorador es composición.
    • Sé que, en realidad no estás haciendo un punto. ¿Necesito decir Decorador de forma explícita para que las personas puedan entender mi estado de cuenta?
    • ¿Qué acerca de un contenedor que expone un subconjunto de los métodos del objeto envuelto, sin adición de la lógica o de los filtros? Tendría que ser un decorador? O un Proxy? O un Adaptador? Consulte programmers.stackexchange.com/questions/247325/…
    • Y lo que si desea duplicar la interfaz del objeto envuelto 1:1, pero, a continuación, agregue un par de métodos adicionales? Es este un decorador o un adaptador?
    • Yo considero que un Decorador, ya que la interfaz es un superconjunto de la clase base.
    • ¿puede dar algunos ejemplos de ellos? en semi-aplicación simple
    • no, no voy a hacer eso.
    • esta es una excelente y concisa respuesta! Creo que sale de la intención de la Fachada patrón claro, sin embargo. Podría usted aclarar que el último elemento de un poco?
    • gracias. Creo que yo no entiendo Fachada (al menos, ya que nuestro equipo ha utilizado), pero podrías considerar la posibilidad de actualizar su respuesta anterior? Esa es la parte que no creo que es tan clara y útil todavía.
    • Lo que significa que – Contenedor de objetos siga modelo de Adaptador, ya que el diseño afecta a todos los objetos?
    • No está claro lo que estamos pidiendo, porque cualquiera de los patrones que he mencionado en mi respuesta podría ser llamado un «contenedor.»

  2. 189

    Como la Factura de la respuesta, dice, sus casos de uso son diferentes.

    Así como sus estructuras.

    • Proxy y Decorador ambos tienen la misma interfaz como sus envuelto tipos, pero el proxy crea una instancia bajo el capó, mientras que el decorador toma una instancia en el constructor.

    • Adaptador de y Fachada ambos tienen una interfaz diferente de lo que se envuelven. Pero el adaptador se deriva de una interfaz existente, mientras que la fachada crea una nueva interfaz.

    • Puente y Adaptador de los dos puntos en un tipo existente. Pero el puente se señalan en un tipo abstracto, y el adaptador podría apuntar a un tipo concreto. El puente permitirá a la par de la aplicación en tiempo de ejecución, mientras que el adaptador no.

    • Su respuesta combinada con Bill envuelve 5 capítulos de los Patrones de Diseño muy bien. Uno podía llamar a un nivel superior (lea: más simple) de la interfaz para el libro.
  3. 50

    Mi opinión sobre el tema.

    Los cuatro patrones tienen mucho en común, los cuatro, a veces informalmente llamado envolturas, o de contenedor de patrones. Todo el uso de la composición, envasado sujeto y de la delegación de la ejecución de los sujetos en algún momento, hacer la asignación de una llamada a un método a otro. Prescindir de cliente de la necesidad de tener que construir un objeto diferente y copiar todos los datos pertinentes. Si se usan sabiamente, que guarda la memoria y el procesador.

    Mediante la promoción de un acoplamiento flexible que hacer una vez que estable el código menos expuestos a cambios inevitables y mejor legible para otros desarrolladores.

    Adaptador de

    Adaptador adapta sujeto (adaptee) a una interfaz diferente. De esta manera podemos agregar el objeto se coloca a una colección de nominalmente diferentes tipos.

    Adaptador de exponer sólo los métodos relevantes para el cliente, puede restringir el acceso de todos los demás, revelando el uso de intenciones para contextos particulares, como la adaptación de la biblioteca externa, que parezca menos general y más enfocada en nuestra aplicación necesita. Adaptadores de aumentar la legibilidad y la auto descripción de nuestro código.

    Adaptadores de escudos, un equipo de la volatilidad en el código de otros equipos; un salvador de la vida de la herramienta cuando se trata con la costa de los equipos 😉

    Menos mencionados propósito es evitar que el tema de la clase de exceso de anotaciones. Con tantas basándose en las anotaciones esto se hace más importante el uso que nunca.

    Adaptador de ayuda a obtener alrededor de Java limitación de sólo la herencia simple. Se pueden combinar varios adaptees bajo uno de los sobres dando la impresión de que la herencia múltiple.

    Código sabio, Adaptador es «delgada». No debe agregar la cantidad de código a la adaptee clase, además de simplemente llamar a la adaptee método y de los datos ocasionales de las conversiones necesarias para hacer este tipo de llamadas.

    No hay muchas buenas adaptador de ejemplos en el JDK o librerías básicas. Los desarrolladores de aplicaciones crear Adaptadores para adaptarse a las bibliotecas de la aplicación de interfaces específicas.

    Decorador

    Decorador no solo delegado, no sólo los mapas de un método a otro, lo hacen más, que modifican el comportamiento de algunos métodos, puede decidir no llame sujeto método, delegado a un objeto diferente, un objeto de ayuda.

    Decoradores suelen añadir (transparente) funcionalidad a objeto envuelto como la tala, el cifrado, el formato, o la compresión de la materia. Esta Nueva funcionalidad puede traer una gran cantidad de código nuevo. Por lo tanto, los decoradores son generalmente mucho más «denso», a continuación, Adaptadores.

    Decorador debe ser una sub-clase de los sujetos de la interfaz. Pueden ser utilizados de forma transparente en lugar de sus súbditos. Ver BufferedOutputStream, es todavía OutputStream y puede ser utilizado como tal. Que es una de las principales técnicas diferencia de los Adaptadores.

    Libro de texto ejemplos de todo decoradores de la familia se encuentra fácilmente en JDK – Java IO. Todas las clases como BufferedOutputStream, FilterOutputStream y ObjectOutputStream son decoradores de OutputStream. Pueden ser capas de cebolla, donde uno de los decorador está decorado de nuevo, añadiendo más funcionalidad.

    Proxy

    Proxy no es un típico contenedor. El objeto envuelto, el proxy tema, podría no existir en el momento de la proxy de la creación. Proxy a menudo crea internamente. Puede ser un objeto pesado creado en la demanda, o es objeto remoto en diferentes JVM o diferentes nodos de la red y aunque no sea objeto de Java, un componente en el código nativo. No es necesario envolver o delegar a otro objeto.

    Ejemplos más típicos son remota de servidores proxy, pesado inicializadores de objeto y el acceso de la representación.

    • Proxy remoto – tema es sobre servidor remoto, diferentes JVM o incluso no
      El sistema Java. Proxy traduce las llamadas de método a RMI/REST/SOAP o llamadas
      todo lo que sea necesario, la protección de cliente de la exposición al subyacente
      tecnología.

    • La Carga perezosa Proxy – totalmente inicializar el objeto sólo el primer uso o
      primer uso intensivo.

    • Proxy de acceso de control de acceso a la asignatura.

    Fachada

    Fachada está estrechamente relacionado con el Principio de diseño de menor Conocimiento (Ley de Demeter).
    La fachada es muy similar a la del Adaptador. Ambos envoltura, ambos mapa de un objeto a otro, pero la diferencia está en la intención. Fachada aplana la estructura compleja de un sujeto, objeto complejo gráfico, la simplificación del acceso a una estructura compleja.

    Fachada envuelve una compleja estructura, proporcionando un plano de una interfaz. Esto evita que el cliente objeto de ser expuestos a las relaciones internas en la estructura de las materias por lo tanto, promover el acoplamiento flexible.

    Puente

    Más compleja variante de modelo de Adaptador donde no sólo la aplicación varía, pero también de la abstracción. Se agrega uno más de direccionamiento indirecto a la delegación. El extra de la delegación es el puente. Se desacopla el Adaptador incluso a partir de la adaptación de la interfaz. Aumenta la complejidad, más que cualquier otro de la otra envoltura de los patrones, por lo que aplicar con cuidado.

    Diferencias en los constructores

    Patrón de diferencias también son evidentes cuando se mira en sus constructores.

    • Proxy no es envolver un objeto existente. No hay ningún tema en el constructor.

    • Decorador y Adaptador de envolver objeto ya existente, y tal es típicamente

      siempre en el constructor.

    • Fachada constructor toma elemento raíz de un conjunto de objetos de gráfico, de lo contrario se ve
      mismo como Adaptador.

    Ejemplo de la vida Real – JAXB Clasificación Adaptador. El propósito de este adaptador es la asignación de un plano simple de la clase a la estructura más compleja requiere externamente y para evitar «contaminar» sujeto de clase con exceso de anotaciones.

  4. 29

    Hay una gran cantidad de superposición en muchos de los patrones GoF. Todos ellos están integrados en el poder de polimorfismo y, a veces, realmente, sólo difieren en la intención. (estrategia vs estado)

    Mi comprensión de los patrones de aumento de 100 veces después de la lectura Head First Design Patterns.

    Se los recomiendo!

  5. 8

    Todas las buenas respuestas de los expertos ya han explicado qué significa cada patrón representa.

    Voy a decorar puntos clave.

    Decorador:

    1. Añadir el comportamiento de objetos en tiempo de ejecución. La herencia es la clave para lograr esta funcionalidad, la cual es la ventaja y la desventaja de este modelo.
    2. Modifica el el comportamiento de interfaz.

    por ejemplo, (con el encadenamiento ) : java.io paquete de clases relacionadas con la InputStream & OutputStream interfaces

    FileOutputStream fos1 = new FileOutputStream("data1.txt");  
    ObjectOutputStream out1 = new ObjectOutputStream(fos1);
    

    Proxy:

    1. Utilizar para la inicialización perezosa, la mejora del rendimiento mediante el almacenamiento en caché del objeto y el control de acceso del cliente/llamada. Puede proporcionar alternativas de comportamiento o llame al objeto real. Durante este proceso, se puede crear un Objeto nuevo.
    2. A diferencia de Decorador, que permite el encadenamiento de los objetos, Proxy no permite el encadenamiento.

    por ejemplo: java.rmi clases del paquete.

    Adaptador:

    1. Se permite que dos no relacionados interfaces para trabajar juntos a través de los diferentes objetos, posiblemente jugando mismo papel.
    2. Modifica la interfaz original.

    por ejemplo, java.io.InputStreamReader (InputStream devuelve un Reader)

    Puente:

    1. Que permite que tanto las abstracciones y las implementaciones varían de forma independiente.
    2. Utiliza composición a lo largo de la herencia.

    por ejemplo, clases de Colección en java.util. List implementado por ArrayList.

    Clave notas:

    1. Adaptador de proporciona una interfaz diferente a su sujeto. Proxy proporciona la misma interfaz. Decorador proporciona una interfaz mejorada.
    2. Adaptador de cambios en el interfaz de un objeto, Decorador mejora de un objeto responsabilidades.
    3. Decorador y Proxy tienen propósitos diferentes pero similares estructuras
    4. Adaptador de hace que las cosas funcionen después de que están diseñados; Puente hace trabajar antes de que se.
    5. Puente está diseñado para permitir la abstracción y la aplicación variar de forma independiente. Adaptador de se modernicen para hacer que las clases no relacionadas trabajar juntos
    6. Decorador está diseñado para permitir que usted agregue responsabilidades a los objetos sin subclases.

    Tener una mirada en el gran SÍ a las preguntas/artículos sobre ejemplos de varios patrones de diseño

    Cuándo Utilizar el Patrón Decorador?

    Cuando no se utiliza el Puente de Patrón? ¿Cómo es diferente de modelo de Adaptador?

    Diferencias entre el Proxy y el Patrón Decorador

  6. 7

    Que son bastante similares, y las líneas entre ellos son bastante gris. Le sugiero que lea el Modelo Proxy y Patrón Decorador entradas en el c2 wiki.

    Las entradas y las discusiones no son muy extensas, y que también enlazar a otros artículos relevantes. Por cierto, el c2 wiki es excelente cuando preguntan acerca de los matices entre los diferentes patrones.

    A la suma de la c2 de las entradas de arriba, yo diría que un decorador agrega/cambia el comportamiento, pero un proxy tiene más que ver con el control de acceso (perezoso de la creación de instancias, acceso remoto, seguridad, etc). Pero como he dicho, las líneas entre ellos son de color gris, y veo referencias a los proxies que fácilmente podría ser visto como decoradores y viceversa.

  7. 3

    Esta es la cita de
    Head First Design Patterns

    Definiciones pertenece al libro. Ejemplos pertenece a mí.

    Decorador – no altera la interfaz, pero añade la responsabilidad. Supongamos que usted tiene un coche de la interfaz,
    al implementar esta para el modelo del coche (s, sv, sl) es posible que necesite agregar más responsabilidad para algunos modelos. Como tiene techo corredizo, airbag, etc..

    Adaptador de – Convierte una interfaz a otra. Usted tiene un coche de la interfaz y que le gustaría actuar como jeep. Así que tome el coche, se modifica y se convierten en un jeep. Ya que no es un verdadero jeep. Pero actúa como un jeep.

    Fachada – Hace una interfaz más simple. Suponga que usted tiene el coche, avión, barco interfaces. En realidad todo lo que usted necesita es una clase que manda a la gente de un lugar a otro. Desea fachada para decidir qué vehículo a utilizar. A continuación, se recogen todos aquellos referencias de interfaz menores de 1 sombrilla y dejar decidir/delegado de mantenerlo simple.

    De cabeza: «Una fachada no sólo simplifica la interfaz, que separa a un cliente de un subsistema
    de los componentes.
    Fachadas y adaptadores puede envolver varias clases, pero de la fachada, la intención es simplificar, mientras que
    un adaptador es para convertir la interfaz de algo diferente».

  8. 2

    Todos los modelos de cuatro implican la envoltura interior de objeto/clase con el exterior, por lo que son muy similares estructuralmente. Yo describiría la diferencia por el propósito:

    • Proxy encapsula el acceso de exterior a interior.
    • Decorador modifica o amplía el comportamiento de interior con el exterior.
    • Adaptador convierte la interfaz de interior a exterior.
    • Puente separa la parte invariable de la conducta (exterior) de la variable o dependientes de la plataforma de la parte (interior).

    Y por interfaz de la variación entre el interior y el exterior de los objetos:

    • en Proxy interfaces son el mismo.
    • en Decorador interfaces son el mismo.
    • en Adaptador interfaces son diferentes formalmente, pero cumplen el mismo propósito.
    • en Puente interfaces son conceptualmente diferentes.
  9. 1

    Yo lo uso muy a menudo a la hora de consumir servicios web. El modelo Proxy probablemente debería cambiarse a algo más pragmático, como «Wrapper Patrón». También tengo una biblioteca que es un Proxy a MS Excel. Esto hace que sea muy fácil para automatizar Excel, sin tener que preocuparse de los detalles del fondo, tales como qué versión está instalada (si hay alguno).

    • ¿No acaba de ser el Adaptador Patrón?
    • Un servicio web es consumida por un Proxy, mientras que el modelo de Adaptador se utiliza más para la conversión o traducción de los datos de una forma a otra.
  10. 1

    Hablar en detalle de la aplicación, me parece una diferencia entre el Proxy y el Decorador, Adaptador, Fachada … En común la aplicación de estos patrones hay un objeto envuelto por una adjuntando objeto. Cliente utiliza adjuntando objeto en lugar del objeto de destino. Y el objeto de jugar en realidad una parte importante dentro de algunos de los métodos de encerrar objeto.

    Sin embargo, en el caso de Proxy, adjuntando objeto puede reproducir algunos de los métodos por sí mismo, no sólo inicializar el objeto de destino cuando el cliente llama a algunos de los métodos que necesita de destino objeto de tomar parte en. Esta es la inicialización perezosa. En el caso de otros modelos, adjuntando objeto está prácticamente basado en el objeto de destino. Así objeto de destino siempre se inicializa junto con encierra objeto en constructores/incubadoras.

    Otra cosa, un proxy hace exactamente lo que es un destino que hace, mientras que los otros patrones de añadir más funcionalidad a la de destino.

  11. 1

    Me gustaría añadir ejemplos a Bill Karwing respuesta (lo cual es genial por cierto.)
    Puedo añadir también algunas diferencias clave de la aplicación, que siento que faltan

    Citado piezas son de respuesta de [https://stackoverflow.com/a/350471/1984346%5D (proyecto de Ley Karwing)

    Proxy, Decorador, el Adaptador y el Puente de variaciones sobre el «ajuste» de una clase.
    Pero sus usos son diferentes.

    • Proxy podría ser utilizado cuando se desea perezoso-crear instancias de un objeto, o
      ocultar el hecho de que usted está llamando a un servicio remoto, o de control de acceso
      para el objeto.

    ProxyClass y ObjectClass que se proxy, debe implementar la misma interfaz, por lo que son intercambiables

    Ejemplo – proxy caro objeto

    class ProxyHumanGenome implements GenomeInterface  {
        private $humanGenome = NULL; 
    
        //humanGenome class is not instantiated at construct time
        function __construct() {
        }
    
        function getGenomeCount() {
            if (NULL == $this->humanGenome) {
                $this->instantiateGenomeClass(); 
            }
            return $this->humanGenome->getGenomeCount();
        }
    } 
    class HumanGenome implement GenomeInterface { ... }
    
    • Decorador también es llamado el «Proxy Inteligente.» Esto se utiliza cuando se desea
      agregar funcionalidad a un objeto, pero no por la ampliación del objeto que
      tipo. Esto le permite hacerlo en tiempo de ejecución.

    DecoratorClass debe(puede) implementar la interfaz extendida de ObjectClass. Así que el ObjectClass podría ser reemplazado por DecoratorClass, pero no viceversa.

    Ejemplo – la adición de adición de la funcionalidad de

    class DecoratorHumanGenome implements CheckGenomeInterface  {
    
        //... same code as previous example
    
        //added functionality
        public function isComplete() {
            $this->humanGenome->getCount >= 21000
        }
    }
    
    interface CheckGenomeInterface extends GenomeInterface {
    
        public function isComplete();
    
    }
    
    class HumanGenome implement GenomeInterface { ... }
    
    • Adaptador de se utiliza cuando se tiene un resumen de la interfaz, y usted desea
      mapa de la interfaz a otro objeto que se ha funcionales similares
      papel, pero con una interfaz diferente.

    Implentation diferencias Proxy, Decorador, Adaptador de

    Adaptador proporciona una interfaz diferente a su sujeto. Proxy proporciona la misma interfaz. Decorador proporciona una interfaz mejorada.

    • Puente es muy similar a la del Adaptador, pero la llamamos Puente cuando
      definir tanto el resumen de la interfaz y la implementación subyacente.
      I. e. no está adaptando a algún legado o código de terceros, usted está
      el diseñador de todo el código, pero usted necesita ser capaz de intercambiar
      diferentes implementaciones.

    • Fachada es de un nivel superior (lea: más simple) de la interfaz para un subsistema de
      una o más clases. Supongamos que usted tiene un concepto complejo que requiere
      varios objetos a representar. Hacer los cambios para un conjunto de objetos
      es confuso, porque no siempre se sabe qué objeto tiene el
      el método que usted necesita llamar. Ese es el tiempo para escribir una Fachada que
      proporciona un alto nivel de métodos para todas las operaciones complejas que usted puede hacer
      a la colección de objetos. Ejemplo: un Modelo de Dominio para una escuela
      sección, con métodos como countStudents(), reportAttendance(),
      assignSubstituteTeacher(), y así sucesivamente.

    La mayoría de la información en la respuesta a esto es a partir de https://sourcemaking.com/design_patterns, que me recomiendan como una excelente recurso de patrones de diseño.

  12. 0

    Creo código dará una idea clara (para complementar otras respuestas). Por favor ver más abajo, (Enfoque de los tipos que una clase implementa y envolturas)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace TestConsole
    {
        class Program
        {
            static void Main(string[] args)
            {
                /* Proxy */
    
                Console.WriteLine(Environment.NewLine);
                Console.WriteLine("PROXY");
                Console.WriteLine(Environment.NewLine);
    
                //instead of creating here create using a factory method, the facory method will return the proxy
                IReal realProxy = new RealProxy();
                Console.WriteLine("calling do work with the proxy object ");
                realProxy.DoWork();
    
                Console.WriteLine(Environment.NewLine);
                Console.WriteLine("ADAPTER");
                Console.WriteLine(Environment.NewLine);
    
                /*Adapter*/
                IInHand objectIHave = new InHand();
                Api myApi = new Api();
                //myApi.SomeApi(objectIHave); /*I cant do this, use a adapter then */
                IActual myAdaptedObject = new ActualAdapterForInHand(objectIHave);
                Console.WriteLine("calling api with  my adapted obj");
                myApi.SomeApi(myAdaptedObject);
    
    
                Console.WriteLine(Environment.NewLine);
                Console.WriteLine("DECORATOR");
                Console.WriteLine(Environment.NewLine);
    
                /*Decorator*/
                IReady maleReady = new Male();
                Console.WriteLine("now male is going to get ready himself");
                maleReady.GetReady();
    
                Console.WriteLine(Environment.NewLine);
    
                IReady femaleReady = new Female();
                Console.WriteLine("now female is going to get ready her self");
                femaleReady.GetReady();
    
                Console.WriteLine(Environment.NewLine);
    
                IReady maleReadyByBeautician = new Beautician(maleReady);
                Console.WriteLine("now male is going to get ready by beautician");
                maleReadyByBeautician.GetReady();
    
                Console.WriteLine(Environment.NewLine);
    
                IReady femaleReadyByBeautician = new Beautician(femaleReady);
                Console.WriteLine("now female is going to get ready by beautician");
                femaleReadyByBeautician.GetReady();
    
                Console.WriteLine(Environment.NewLine);
    
                Console.ReadLine();
    
    
            }
        }
    
        /*Proxy*/
    
        public interface IReal
        {
            void DoWork();
        }
    
        public class Real : IReal
        {
            public void DoWork()
            {
                Console.WriteLine("real is doing work ");
            }
        }
    
    
        public class RealProxy : IReal
        {
            IReal real = new Real();
    
            public void DoWork()
            {
                real.DoWork();
            }
        }
    
        /*Adapter*/
    
        public interface IActual
        {
            void DoWork();
        }
    
        public class Api
        {
            public void SomeApi(IActual actual)
            {
                actual.DoWork();
            }
        }
    
        public interface IInHand
        {
            void DoWorkDifferently();
        }
    
        public class InHand : IInHand
        {
            public void DoWorkDifferently()
            {
                Console.WriteLine("doing work slightly different ");
            }
        }
    
        public class ActualAdapterForInHand : IActual
        {
            IInHand hand = null;
    
            public ActualAdapterForInHand()
            {
                hand = new InHand();
            }
    
            public ActualAdapterForInHand(IInHand hnd)
            {
                hand = hnd;
            }
    
            public void DoWork()
            {
                hand.DoWorkDifferently();
            }
        }
    
        /*Decorator*/
    
        public interface IReady
        {
            void GetReady();
        }
    
        public class Male : IReady
        {
            public void GetReady()
            {
                Console.WriteLine("Taking bath.. ");
                Console.WriteLine("Dress up....");
            }
        }
    
        public class Female : IReady
        {
            public void GetReady()
            {
                Console.WriteLine("Taking bath.. ");
                Console.WriteLine("Dress up....");
                Console.WriteLine("Make up....");
            }
        }
    
        //this is a decorator
        public class Beautician : IReady
        {
            IReady ready = null;
    
            public Beautician(IReady rdy)
            {
                ready = rdy;
            }
    
            public void GetReady()
            {
                ready.GetReady();
                Console.WriteLine("Style hair ");
    
                if (ready is Female)
                {
                    for (int i = 1; i <= 10; i++)
                    {
                        Console.WriteLine("doing ready process " + i);
                    }
    
                }
            }
        }
    
    }
    
  13. -2

    Patrón de diseño no es matemática, es la combinación del arte y de la ingeniería de software. No hay nada como para que este requisito tiene que usar proxy, puente, etc. Los patrones de diseño son creados para resolver los problemas. Si usted anticipa un problema de diseño, para luego usarla. Basado en la experiencia, se llega a saber para el problema específico, que el patrón de uso. Si usted es bueno en sólidos principios de diseño, que se han aplicado patrón de diseño sin saber que es patrón. Ejemplo común es statergy de fábrica y los patrones de

    Por lo tanto se concentran más en los sólidos desighn principios, limpia de codificación de los principios y ttd

    • De acuerdo, aunque no responder la pregunta.

Dejar respuesta

Please enter your comment!
Please enter your name here