Adjunto (patrón de diseño)

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 10 de julio de 2018; las comprobaciones requieren 9 ediciones .
Diputado
apoderado
Tipo de estructural
Objetivo Proporciona un objeto sustituto que controla el acceso a otro objeto.
ventajas
  •  sustituto remoto;
  •  el proxy virtual puede realizar la optimización;
  •  sustituto protector;
  • enlace "inteligente";
menos
  • Aumento dramático en el tiempo de respuesta.
Descrito en Patrones de diseño

Proxy ( Ing.  Proxy ) es un patrón de diseño estructural que proporciona un objeto que controla el acceso a otro objeto, interceptando todas las llamadas (realiza la función de un contenedor ).

Propósito

Problema

El acceso al objeto debe controlarse sin cambiar el comportamiento del cliente. 

Es necesario acceder al objeto de tal manera que no cree objetos reales directamente, sino a través de otro objeto que puede tener una funcionalidad adicional.

Solución

Crea un sustituto para un objeto real. El Proxy almacena una referencia que permite al Proxy referirse al sujeto real (un objeto de la clase Proxy puede referirse a un objeto de la clase Sujeto si las interfaces del Sujeto Real y el Sujeto son las mismas). Dado que la interfaz "Sujeto real" es idéntica a la interfaz "Sujeto", de modo que el "Sustituto" puede sustituir al "Sujeto real", controla el acceso al "Sujeto real", puede ser responsable de crear o eliminar el " verdadero sujeto". "Asunto" define una interfaz común entre "Asunto real" y "Apoderado" para que se pueda utilizar "Apoderado" dondequiera que se espere un "Asunto real". Si es necesario, las solicitudes pueden ser enviadas por el "Adjunto" al "Sujeto real".

Especies

Ventajas y desventajas de usar

Beneficios

Desventajas

Alcance

El patrón Proxy se puede usar cuando se trabaja con una conexión de red, con un objeto enorme en la memoria (o en el disco), o con cualquier otro recurso que sea difícil o difícil de copiar. Un caso de uso bien conocido es un objeto que cuenta el número de referencias.

Proxy y patrones relacionados [1]

Ejemplos de implementación

Java

Ejemplo de implementación clase pública Principal { public static void main ( String [] args ) { // Crear proxy matemático IMath p = new MathProxy (); // Haz el sistema matemático . fuera _ println ( "4 + 2 = " + p . sumar ( 4 , 2 )); sistema _ fuera _ println ( "4 - 2 = " + p . sub ( 4 , 2 )); sistema _ fuera _ println ( "4 * 2 = " + p . mul ( 4 , 2 )); sistema _ fuera _ println ( "4/2 = " + p . div ( 4 , 2 )); } } /** * "Asunto" */ interfaz pública IMath { public double add ( doble x , doble y ); public double sub ( doble x , doble y ); público doble mul ( doble x , doble y ); público doble div ( doble x , doble y ); } /** * "Sujeto Real" */ public class Math implementa IMath { public double add ( double x , double y ) { return x + y ; } public double sub ( doble x , doble y ) { return x - y ; } public double mul ( doble x , doble y ) { return x * y ; } public double div ( doble x , doble y ) { return x / y ; } } /** * "Objeto Proxy" */ la clase pública MathProxy implementa IMath { matemáticas matemáticas privadas ; public double add ( doble x , doble y ) { lazyInitMath (); matemáticas de retorno . sumar ( x , y ); } public double sub ( doble x , doble y ) { lazyInitMath (); matemáticas de retorno . sub ( x , y ); } public double mul ( doble x , doble y ) { lazyInitMath (); matemáticas de retorno . mu ( x , y ); } public double div ( doble x , doble y ) { lazyInitMath (); matemáticas de retorno . div ( x , y ); } private void lazyInitMath () { if ( matemáticas == nulo ) { matemáticas = new Math (); } } }

escala

Ejemplo de implementación object Main extiende la aplicación { val p : IMath = new MathProxy System . fuera _ println ( "4 + 2 = " + p . sumar ( 4 , 2 )) Sistema . fuera _ println ( "4 - 2 = " + p . sub ( 4 , 2 )) Sistema . fuera _ println ( "4 * 2 = " + p . mul ( 4 , 2 )) Sistema . fuera _ println ( "4/2 = " + p . div ( 4 , 2 )) } /** * "Sujeto" */ rasgo IMath { def add ( x : Doble , y : Doble ): Doble def sub ( x : Doble , y : Doble ): Doble def mul ( x : Doble , y : Doble ): Doble def div ( x : Doble , y : Doble ): Doble } /** * "Sujeto real" */ class Math extiende IMath { def add ( x : Double , y : Double ) = x + y def sub ( x : Doble , y : Doble ) = x - y def mul ( x : Doble , y : Doble ) = x * y def div ( x : Doble , y : Doble ) = x / y } /** * "Objeto Proxy" */ class MathProxy extiende IMath { private lazy val math = new Math def sumar ( x : doble , y : doble ) = matemáticas . sumar ( x , y ) def sub ( x : Doble , y : Doble ) = matemática . sub ( x , y ) def mul ( x : Doble , y : Doble ) = matemáticas . mul ( x , y ) def div ( x : Doble , y : Doble ) = matemáticas . división ( x , y ) }

C++

Ejemplo de implementación /** * "Asunto" */ clase IMath { público : suma doble virtual ( doble , doble ) = 0 ; sub doble virtual ( doble , doble ) = 0 ; doble virtual mul ( doble , doble ) = 0 ; div doble virtual ( doble , doble ) = 0 ; }; /** * "Sujeto real" */ clase Matemáticas : public IMath { público : suma doble virtual ( doble x , doble y ) { devuelve x + y _ } sub doble virtual ( doble x , doble y ) { devuelve x - y ; } doble virtual mul ( doble x , doble y ) { volver x * y _ } div doble virtual ( doble x , doble y ) { volver x / y _ } }; /** * "Objeto proxy" */ clase MathProxy : public IMath { público : Proxy matemático () { matemática = nueva matemática (); } virtual ~ MathProxy () { eliminar matemáticas ; } suma doble virtual ( doble x , doble y ) { devolver matemáticas -> agregar ( x , y ); } sub doble virtual ( doble x , doble y ) { devuelve matemática -> sub ( x , y ); } doble virtual mul ( doble x , doble y ) { devuelve matemáticas -> mul ( x , y ); } div doble virtual ( doble x , doble y ) { devuelve matemática -> div ( x , y ); } privado : IMath * matemáticas ; }; #incluir <iostream> usando std :: cout ; usando std :: endl ; int principal () { // Crear proxy matemático IMath * proxy = new MathProxy (); // Haz el cálculo matemático << "4 + 2 = " << proxy - > add ( 4 , 2 ) << endl ; cout << "4 - 2 = " << proxy -> sub ( 4 , 2 ) << endl ; cout << "4 * 2 = " << proxy -> mul ( 4 , 2 ) << endl ; cout << "4/2 = " << proxy -> div ( 4 , 2 ) << endl ; eliminar proxy ; devolver 0 ; }

C#

Ejemplo de implementación utilizando el sistema ; utilizando System.Threading ; class MainApp { static void Main () { // Crear proxy matemático IMath p = new MathProxy (); // Haz la consola matemática . WriteLine ( "4 + 2 = " + p . Sumar ( 4 , 2 )); consola _ WriteLine ( "4 - 2 = " + p . Sub ( 4 , 2 )); consola _ WriteLine ( "4 * 2 = " + p . Mul ( 4 , 2 )); consola _ WriteLine ( "4 / 2 = " + p . Div ( 4 , 2 )); // Esperar a la Consola del usuario . leer (); } } /// <summary> /// Subject - subject /// </summary> /// <remarks> /// <li> /// <lu> define un común para <see cref="Math"/> y <ver cref="Proxy"/> interfaz para que la clase /// <ver cref="Proxy"/> se pueda usar en cualquier lugar <ver cref="Math"/></lu> /// </ li> / // </observaciones> interfaz pública IMath { double Add ( double x , double y ); doble Sub ( doble x , doble y ); doble Mul ( doble x , doble y ); doble Div ( doble x , doble y ); } /// <summary> /// RealSubject - objeto real /// </summary> /// <remarks> /// <li> /// <lu>define el objeto real representado por el proxy</lu> // / </li> /// </remarks> class Math : IMath { public Math () { Console . WriteLine ( "Crear objeto Math. Espera..." ); hilo _ Dormir ( 1000 ); } public double Add ( double x , double y ){ return x + y ;} public double Sub ( double x , double y ){ return x - y ;} public double Mul ( double x , double y ){ return x * y ; } public double Div ( doble x , doble y ){ return x / y ;} } /// <summary> /// Proxy es un proxy /// </summary> /// <remarks> /// <li> /// <lu> almacena una referencia que permite que el proxy se refiera a lo real /// asunto. El objeto de clase <ver cref="MathProxy"/> puede referirse al objeto de clase /// <ver cref="IMath"/> si las interfaces de clase <ver cref="Math"/> y <ver cref="IMath"/ > son iguales;</lu> /// <lu>proporciona una interfaz idéntica a la de <see cref="IMath"/>, de modo que siempre se puede proporcionar un proxy /// en lugar del asunto real;</ lu> /// < lu>controla el acceso al tema real y puede ser responsable de crear /// y borrarlo;</lu> /// <lu>otras funciones dependen del tipo de proxy: /// < li> /// <lu><b >proxy remoto</b> es responsable de codificar la solicitud y sus argumentos /// y enviar la solicitud codificada al sujeto real /// en un espacio de direcciones diferente;</lu > /// <lu><b>el proxy virtual</b> puede almacenar en caché /// información adicional sobre el tema real para retrasar su creación.</lu> /// <lu><b>proxy de protección</b > comprueba si la persona que llama /// tiene los permisos necesarios para realizar la solicitud; </lu> /// </li> /// </lu> /// </li> /// < /observaciones> class MathProxy : IMath { Math math ; MathProxy público () { matemáticas = nulo ; } /// <summary> /// Operación rápida: no requiere un sujeto real /// </summary> /// <param name="x"></param> /// <param name="y" >< /param> /// <devoluciones></devoluciones> public double Add ( double x , double y ) { return x + y ; } public double Sub ( doble x , doble y ) { return x - y ; } /// <summary> /// Operación lenta: requiere la creación de un sujeto real /// </summary> /// <param name="x"></param> /// <param name="y" >< /param> /// <devoluciones></devoluciones> public double Mul ( double x , double y ) { if ( math == null ) math = new Math (); matemáticas de retorno . Mu ( x , y ); } public double Div ( doble x , doble y ) { if ( math == null ) math = new Math (); matemáticas de retorno . División ( x , y ); } }

JavaScript

Ejemplo de implementación /* Asunto */ class IMath { add ( x , y ) {} sub ( x , y ) {} } /* Sujeto real */ class RMath extends IMath { add ( x , y ) { return x + y ; } sub ( x , y ) { devuelve x - y ; } } /* Proxy */ clase MathProxy extiende IMath { matemáticas = nuevo RMath () agregar ( x , y ) { devuelve esto . matemáticas _ add ( x , y ) } sub ( x , y ) { devuelve esto . matemáticas _ sub ( x , y ) } } const prueba = new MathProxy () alerta ( prueba . agregar ( 3 , 2 )) // 5 alerta ( prueba . sub ( 3 , 2 )) // 1

Rubí

Ejemplo de implementación módulo ProxyPattern # Proxy tiene la misma interfaz que un sujeto real # Cuenta de clase de sujeto real attr_reader : saldo def inicializar ( saldo = 0 ) @saldo = fin del saldo depósito def ( cantidad ) @saldo += cantidad final def retirar ( cantidad ) @saldo -= cantidad final final protección del módulo # Funcionalidad adicional para controlar el acceso al sujeto real # Proxy class AccountProxy def initialize ( asunto , usuario_actual ) @asunto = asunto @usuario_actual = usuario_actual @saldo = 0 end depósito def ( cantidad ) @subject . depósito ( cantidad ) si autorizar fin def retirar ( cantidad ) @subject . retirar ( cantidad ) si autorizar fin def equilibrar @sujeto . final del saldo privado def Authorize pone 'Acceso denegado' a menos que @current_user == ' admin' @current_user == 'admin' end end def auto . ejecutar pone '=> Proxy::Protection' pone 'como usuario' protected_account = AccountProxy . nueva ( Cuenta . nueva , 'usuario' ) cuenta_protegida . depósito ( 20 ) protected_account . retirar ( 10 ) pone la cuenta_protegida . balance pone 'como administrador' protected_account = AccountProxy . new ( Cuenta . new , 'admin' ) protected_account . depósito ( 20 ) protected_account . retirar ( 10 ) pone la cuenta_protegida . balance pone '' fin fin módulo Virtual # Delay realSubject loading (lazy loading) # Proxy class AccountProxy def initialize ( local_balance = 0 ) @local_balance = local_balance end depósito def ( cantidad ) @local_balance += cantidad final def retirar ( cantidad ) @local_balance -= cantidad final tema de equilibrio def . final del saldo def sujeto @asunto ||= Cuenta . nuevo ( @local_balance ) _ _ def auto . ejecutar pone '=> Proxy::Virtual' cuenta_local = AccountProxy . nueva cuenta_local . depósito ( 20 ) cuenta_local . retirar ( 10 ) cuenta_local . depósito ( 15 ) local_account . retirar ( 5 ) pone 'Todavía no hay una cuenta real:' pone cuenta_local . inspeccionar cuenta_local . saldo pone 'Se creó la cuenta real:' pone local_account . inspeccionar pone '' fin fin def auto . ejecutar Protección . ejecutarVirtual ._ _ correr fin fin

PHP5

Ejemplo de implementación <?php /// Asunto - asunto /// define una interfaz común entre Math y "Proxy", de modo que /// la clase "Proxy" se puede usar en cualquier lugar interface IMath { function Add ( $x , $y ); función Sub ( $x , $y ); función Mul ( $x , $y ); función Div ( $x , $y ); } /// RealSubject - el objeto real /// define el objeto real representado por el proxy class Math implementa IMath { función pública __construct () { print ( "Crear objeto Math. Espere..." ); dormir ( 5 ); } función pública Agregar ( $x , $y ){ volver $x + $y ;} función pública Sub ( $x , $y ){ volver $x - $y ;} función pública Mul ( $x , $y ){ volver $x * $y ;} función pública Div ( $x , $y ){ return $x / $y ;} } /// Proxy - proxy /// almacena un enlace que permite que el proxy se refiera al /// asunto real. El objeto de clase "MathProxy" puede acceder al objeto de clase /// "Math" si las interfaces de las clases "Math" e "IMath" son las mismas; /// proporciona una interfaz idéntica a la interfaz "IMath", por lo que siempre se puede proporcionar un proxy /// en lugar del sujeto real; /// controla el acceso al tema real y puede ser responsable de crearlo /// y borrarlo; /// otras tareas dependen del tipo de proxy: /// el proxy remoto es responsable de codificar la solicitud y sus argumentos /// y enviar la solicitud codificada al sujeto real /// en un espacio de direcciones diferente; /// El proxy virtual puede almacenar en caché /// información adicional sobre el sujeto real para retrasar su creación. /// el proxy protector verifica si la persona que llama /// tiene los permisos necesarios para ejecutar la solicitud; class MathProxy implementa IMath { protected $math ; public function __construct () { $this -> math = null ; } /// Operación rápida: no requiere un sujeto real función pública Add ( $x , $y ) { return $x + $y ; } función pública Sub ( $x , $y ) { return $x - $y ; } /// Operación lenta: requiere la creación de una función pública de sujeto real Mul ( $x , $y ) { if ( $this -> math == null ) $this -> math = new Math (); devuelve $esto -> matemática -> Mul ( $x , $y ); } public function Div ( $x , $y ) { if ( $this -> math == null ) $this -> math = new Math (); devuelve $esto -> matemática -> Div ( $x , $y ); } } $p = nuevo MathProxy ; // Haz la impresión matemática ( "4 + 2 = " . $p -> Suma ( 4 , 2 )); imprimir ( "4 - 2 = " . $p -> Sub ( 4 , 2 )); imprimir ( "4 * 2 = " . $p -> Mul ( 4 , 2 )); imprimir ( "4/2 = " . $p -> Div ( 4 , 2 )); ?>

ActionScript

Ejemplo de implementación //archivo IMath.as paquete { interfaz pública IMath { function add ( a : Número , b : Número ) : Número ; función sub ( a : Número , b : Número ) : Número ; función mul ( a : Número , b : Número ) : Número ; función div ( a : Número , b : Número ) : Número ; } } //file MathSubject.as paquete { public class MathSubject implementa IMath { public function add ( a : Number , b : Number ) : Number { return a + b ; } public function sub ( a : Número , b : Número ) : Número { return a - b ; } public function mul ( a : Número , b : Número ) : Número { return a * b ; } public function div ( a : Número , b : Número ) : Número { return a / b ; } } } //file MathProxy.as paquete { public class MathProxy implementa IMath { private var math : MathSubject ; función pública MathProxy () { matemáticas = new MathSubject (); } función pública sumar ( a : Número , b : Número ) : Número { return math . suma ( a , b ); } función pública sub ( a : Número , b : Número ) : Número { return math . sub ( a , b ); } public function mul ( a : Número , b : Número ) : Número { return math . mu ( a , b ); } función pública div ( a : número , b : número ) : número { si ( b ! = 0 ) devuelve matemáticas . div ( a , b ); else { trace ( "División por cero." ); número de retorno ._ INFINITO_POSITIVO ; } } } } //archivo Main.as paquete { import flash.display.Sprite ; clase pública Main extiende Sprite { public function Main () { playWithMath ( new MathSubject ()); jugarConMath ( nuevo MathProxy ()); } función pública playWithMath ( math : IMath ) : void { trace ( math . add ( 5 , 0 )); rastrear ( matemáticas . sub ( 5 , 0 )); rastrear ( matemáticas . mul ( 5 , 0 )); rastrear ( matemáticas . div ( 5 , 0 )); } } }

Pitón

Ejemplo de implementación # -*- codificación: utf-8 -*- clase IMath : """Interfaz para proxy y sujeto real""" def add ( self , x , y ): aumentar NotImplementedError () def sub ( self , x , y ): aumentar NotImplementedError () def mul ( self , x , y ): aumentar NotImplementedError () def div ( self , x , y ): aumentar NotImplementedError () class Math ( IMath ): """Sujeto real""" def add ( self , x , y ): devuelve x + y def sub ( self , x , y ): devuelve x - y def mul ( self , x , y ): devuelve x * y def div ( self , x , y ): devuelve x / y class Proxy ( IMath ): """Proxy""" def __init__ ( self ): self . matemáticas = Matemáticas () def suma ( self , x , y ): devuelve x + y def sub ( self , x , y ): devuelve x - y def mul ( self , x , y ): devuelve self . matemáticas _ mul ( x , y ) def div ( self , x , y ): return float ( 'inf' ) if y == 0 else self . matemáticas _ división ( x , y ) p = Proxy () x , y = 4 , 2 print '4 + 2 = ' + str ( p . add ( x , y )) print '4 - 2 = ' + str ( p . sub ( x , y )) imprime '4 * 2 = ' + str ( p . mul ( x , y )) imprime '4 / 2 = ' + str ( p . div ( x , y ))

VB.NET

Ejemplo de implementación Importaciones Sistema.Roscado Class MainApp Shared Sub Main () ' Crear proxy matemático Dim p As IMath = New MathProxy () ' Haz la consola de matemáticas . WriteLine ( "4 + 2 = " & p . Agregar ( 4 , 2 )) Consola . WriteLine ( "4 - 2 = " & p . Subtr ( 4 , 2 )) Consola . WriteLine ( "4 * 2 = " & p . Mul ( 4 , 2 )) Consola . WriteLine ( "4/2 = " & p . Div ( 4 , 2 )) 'Esperar a la Consola del usuario . Lectura () End Sub End Class ''' <summary> ''' Asunto - el asunto de ''' </summary> ''' <comentarios> ''' <li> ''' <lu> define común a <see cref="Math"/ > y <see cref="Proxy"/> interfaz para que la clase ''' <see cref="Proxy"/> se pueda usar en cualquier lugar <see cref="Math"/></lu> ''' </ li> ''' </remarks> Interfaz pública IMath Function Add ( ByVal x As Double , ByVal y As Double ) As Double Function Subtr ( ByVal x As Double , ByVal y As Double ) As Double Function Mul ( ByVal x As Double , ByVal y As Double ) As Double Function Div ( ByVal x As Double , ByVal y As Double ) As Double End Interfaz ''' <summary> ''' RealSubject - el objeto real ''' </summary> ''' <remarks> ''' <li> ''' <lu>identifica el objeto real representado por el proxy</lu > '' ' </li> ''' </remarks> Class Math implementa IMath Public Sub New () Consola . WriteLine ( "Crear objeto Math. Espere..." ) Thread . Dormir ( 1000 ) Finalizar sub Public Function Add ( ByVal x As Double , ByVal y As Double ) As Double Implementa IMath . Añadir Retorno x + y Función final Función Pública Subtr ( ByVal x As Double , ByVal y As Double ) As Double Implementa IMath . Subtr Retorno x - y Función final Función Pública Mul ( ByVal x As Double , ByVal y As Double ) As Double Implementa IMath . Mul Return x * y End Function Public Function Div ( ByVal x As Double , ByVal y As Double ) As Double Implementa IMath . Div Retorno x / y Función final clase final ''' <summary> ''' Proxy proxy ''' </summary> ''' <remarks> ''' <li> ''' <lu> almacena una referencia que permite que el proxy se refiera al real '' ' sujeto . Un objeto de clase <ver cref="MathProxy"/> puede referirse a un objeto de clase ''' <ver cref="IMath"/> si la clase interactúa <ver cref="Math"/> y <ver cref= "IMath"/ > son iguales;</lu> ''' <lu>proporciona una interfaz idéntica a la de <see cref="IMath"/>, de modo que siempre se puede proporcionar el marcador de posición ''' en lugar del sujeto real;</lu> ''' < lu>controla el acceso al sujeto real y puede ser responsable de su creación ''' y eliminación;</lu> ''' <lu>otras funciones dependen del tipo de proxy : ''' <li> ''' <lu><b >proxy remoto</b> es responsable de codificar la solicitud y sus argumentos ''' y enviar la solicitud codificada al sujeto real en un espacio de direcciones diferente '' ';</lu> ''' <lu><b>el proxy virtual</b> puede almacenar en caché información adicional ''' sobre el sujeto real para retrasar su creación.</lu> ''' <lu><b> proxy de protección</b> comprueba si la persona que llama ''' tiene los permisos necesarios para realizar la solicitud; </lu> ''' </li> ''' </lu> ''' </li> ''' < /observaciones> Class MathProxy implementa IMath Matemáticas privadas As Math = Nothing ''' <summary> ''' Operación rápida - no requiere un sujeto real ''' </summary> Public Function Add ( ByVal x As Double , ByVal y As Double ) As Double Implementa IMath . Añadir Retorno x + y Función final Función Pública Subtr ( ByVal x As Double , ByVal y As Double ) As Double Implementa IMath . Subtr Retorno x - y Función final ''' <summary> ''' Operación lenta - requiere la creación de un sujeto real ''' </summary> Public Function Mul ( ByVal x As Double , ByVal y As Double ) As Double Implementa IMath . Mul Si math no es nada Entonces math = New Math () End If Return math . Mul ( x , y ) Función final Public Function Div ( ByVal x As Double , ByVal y As Double ) As Double Implementa IMath . Div Si las matemáticas no son nada Entonces matemáticas = New Math () End If Return math . Div ( x , y ) Función final Clase final

Rápido

Ejemplo de implementación // coincidencia de protocolo de asunto { func add ( x : Int , y : Int ) -> Int func sub ( x : Int , y : Int ) -> Int func mul ( x : Int , y : Int ) -> Int func div ( x : Int , y : Int ) -> Int } // Clase de sujeto real MatchImp : Match { func add ( x : Int , y : Int ) -> Int { return x + y } func sub ( x : Int , y : Int ) -> Int { retornar x - y } func mul ( x : Int , y : Int ) -> Int { retornar x * y } func div ( x : Int , y : Int ) -> Int { retornar x / y } } // Clase de proxy MatchProxy : Coincidencia { privado dejar matemáticas = MatchImp () func add ( x : Int , y : Int ) -> Int { return math . sumar ( x : x , y : y ) } func sub ( x : Int , y : Int ) -> Int { return math . sub ( x : x , y : y ) } func mul ( x : Int , y : Int ) -> Int { return math . mu ( x : x , y : y ) } func div ( x : Int , y : Int ) -> Int { return math . div ( x : x , y : y ) } } // usa proxy let proxy = MatchProxy () print ( "7 * 8 = \( proxy . mul ( x : 8 , y : 7 )) " )

Véase también

  • Programación posterior al objeto

Notas

  1. Diarios del desarrollador // Proxy (enlace descendente) . Consultado el 26 de mayo de 2010. Archivado desde el original el 14 de mayo de 2010. 

Literatura

  • CodeLIB.YOURS // Proxy Archivado el 14 de mayo de 2010 en Wayback Machine .
  • E. Gamma, R. Helm, R. Johnson, J. Vlissides . Técnicas de diseño orientado a objetos. Design Patterns.=Design Patterns.Elementos de software orientado a objetos reutilizable. - San Petersburgo. : Pedro, 2001. - 368 p. — ISBN 5-272-00355-1 .
  • Eric Freeman, Elizabeth Freeman, Kathy Siera, Bert Bates. Patrones de diseño. - San Petersburgo. : Pedro, 2012. - 656 p. - ISBN 978-5-459-00435-9 .

Enlaces