Adjunct (model de proiectare)

Versiunea actuală a paginii nu a fost încă revizuită de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 10 iulie 2018; verificările necesită 9 modificări .
Adjunct
proxy
Tip de structural
Scop Oferă un obiect surogat care controlează accesul la un alt obiect.
pro
  •  înlocuitor la distanță;
  •  proxy-ul virtual poate efectua optimizarea;
  •  înlocuitor de protecție;
  • link „inteligent”;
Minusuri
  • creșterea dramatică a timpului de răspuns.
Descris în Design Patterns da

Proxy ( Eng.  Proxy ) este un model de proiectare structurală care oferă un obiect care controlează accesul la un alt obiect, interceptând toate apelurile (îndeplinește funcția de container ).

Scop

Problemă

Accesul la obiect trebuie controlat fără a modifica comportamentul clientului. 

Este necesar să accesați obiectul în așa fel încât să nu creați obiecte reale direct, ci printr-un alt obiect care poate avea funcționalitate suplimentară.

Soluție

Creați un surogat pentru un obiect real. Proxy-ul stochează o referință care îi permite Proxy-ului să se refere la subiectul real (un obiect al clasei Proxy se poate referi la un obiect al clasei Subiect dacă interfețele Subiectului Real și Subiectului sunt aceleași). Deoarece interfața „Subiect real” este identică cu interfața „Subiect”, astfel încât „Subiectul” poate fi înlocuit cu „Subiect real”, controlează accesul la „Subiect real”, poate fi responsabil pentru crearea sau ștergerea „Subiectului real”. Subiect real”. „Subiect” definește o interfață comună între „Subiect real” și „Proxy”, astfel încât „Subiect” să poată fi utilizat oriunde este de așteptat „Subiect real”. Dacă este necesar, cererile pot fi înaintate de către „Deputat” către „Subiectul real”.

Specie

Avantajele și dezavantajele utilizării

Beneficii

Dezavantaje

Domeniul de aplicare

Modelul Proxy poate fi folosit atunci când lucrați cu o conexiune de rețea, cu un obiect uriaș în memorie (sau pe disc) sau cu orice altă resursă care este dificil sau dificil de copiat. Un caz de utilizare binecunoscut este un obiect care numără numărul de referințe.

Proxy și modele aferente [1]

Exemple de implementare

Java

Exemplu de implementare clasă publică principală { public static void main ( String [] args ) { // Creați proxy matematic IMath p = new MathProxy (); // Faceți sistemul de matematică . afară . println ( "4 + 2 = " + p . adaugă ( 4 , 2 )); Sistem . afară . println ( "4 - 2 = " + p . sub ( 4 , 2 )); Sistem . afară . println ( "4 * 2 = " + p . mul ( 4 , 2 )); Sistem . afară . println ( "4 / 2 = " + p . div ( 4 , 2 )); } } /** * „Subiect” */ interfață publică IMath { public double add ( dublu x , dublu y ); public double sub ( dublu x , dublu y ); public double mul ( dublu x , dublu y ); public double div ( dublu x , dublu y ); } /** * „Subiect real” */ Clasa publică Math implementează IMath { public double add ( double x , double y ) { return x + y ; } public double sub ( dublu x , dublu y ) { return x - y ; } public double mul ( double x , double y ) { return x * y ; } public double div ( double x , double y ) { return x / y ; } } /** * „Obiect proxy” */ clasa publică MathProxy implementează IMath { matematică particulară ; _ public double add ( dublu x , dublu y ) { lazyInitMath (); întoarce matematica . adaugă ( x , y ); } public double sub ( dublu x , dublu y ) { lazyInitMath (); întoarce matematica . sub ( x , y ); } public double mul ( double x , double y ) { lazyInitMath (); întoarce matematica . mul ( x , y ); } public double div ( dublu x , dublu y ) { lazyInitMath (); întoarce matematica . div ( x , y ); } private void lazyInitMath () { if ( math == null ) { math = new Math (); } } }

scala

Exemplu de implementare obiect Main extinde App { val p : IMath = sistem MathProxy nou . afară . println ( "4 + 2 = " + p . adaugă ( 4 , 2 )) Sistem . afară . println ( "4 - 2 = " + p . sub ( 4 , 2 )) Sistem . afară . println ( "4 * 2 = " + p . mul ( 4 , 2 )) Sistem . afară . println ( "4 / 2 = " + p . div ( 4 , 2 )) } /** * „Subiect” */ trăsătură IMath { def add ( x : Double , y : Double ): Double def sub ( x : dublu , y : dublu ): dublu def mul ( x : dublu , y : dublu ): dublu def div ( x : dublu , y : dublu ): dublu } /** * „Subiect real” */ class Math extinde IMath { def add ( x : Double , y : Double ) = x + y def sub ( x : dublu , y : dublu ) = x - y def mul ( x : Double , y : Double ) = x * y def div ( x : dublu , y : dublu ) = x / y } /** * „Obiect proxy” */ clasa MathProxy extinde IMath { private lazy val math = new Math def add ( x : Double , y : Double ) = matematică . adaugă ( x , y ) def sub ( x : dublu , y : dublu ) = matematică . sub ( x , y ) def mul ( x : dublu , y : dublu ) = matematică . mul ( x , y ) def div ( x : dublu , y : dublu ) = matematică . div ( x , y ) }

C++

Exemplu de implementare /** * „Subiect” */ clasa IMath { public : virtual double add ( dublu , dublu ) = 0 ; virtual double sub ( dublu , dublu ) = 0 ; virtual dublu mul ( dublu , dublu ) = 0 ; virtual double div ( dublu , dublu ) = 0 ; }; /** * „Subiect real” */ class Math : public IMath { public : virtual double add ( dublu x , dublu y ) { returnează x + y _ } virtual dublu sub ( dublu x , dublu y ) { întoarce x - y ; } virtual dublu mul ( dublu x , dublu y ) { returnează x * y _ } virtual double div ( dublu x , dublu y ) { returnează x / y _ } }; /** * „Obiect proxy” */ clasa MathProxy : public IMath { public : MathProxy () { math = new Math (); } virtual ~ MathProxy () { sterge matematica ; } virtual double add ( dublu x , dublu y ) { returnare matematică -> adăugare ( x , y ); } virtual dublu sub ( dublu x , dublu y ) { return math -> sub ( x , y ); } virtual dublu mul ( dublu x , dublu y ) { return math -> mul ( x , y ); } virtual double div ( dublu x , dublu y ) { return math -> div ( x , y ); } privat : IMath * matematică ; }; #include <iostream> folosind std :: cout ; folosind std :: endl ; int main () { // Creați proxy matematic IMath * proxy = nou MathProxy (); // Faceți calculul matematic << " 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 ; șterge proxy ; returnează 0 ; }

C#

Exemplu de implementare folosind System ; folosind System.Threading ; class MainApp { static void Main () { // Creați proxy matematic IMath p = new MathProxy (); // Faceți Consola de matematică . WriteLine ( "4 + 2 = " + p . Adăugați ( 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 )); // Așteptați Consola utilizatorului . citește (); } } /// <summary> /// Subiect - subiect /// </summary> /// <remarks> /// <li> /// <lu> definește un comun pentru <see cref="Math"/> și <see cref="Proxy"/> interfață astfel încât clasa /// <see cref="Proxy"/> să poată fi folosită oriunde <see cref="Math"/></lu> /// </ li> / // </remarks> interfață publică IMath { double Add ( double x , double y ); dublu Sub ( dublu x , dublu y ); dublu Mul ( dublu x , dublu y ); double Div ( dublu x , dublu y ); } /// <summary> /// RealSubject - obiect real /// </summary> /// <remarks> /// <li> /// <lu>definește obiectul real reprezentat de proxy</lu> // / </li> /// </remarks> class Math : IMath { public Math () { Console . WriteLine ( "Creează obiect Math. Așteaptă..." ); fir . Somn ( 1000 ); } public double Adaugă ( 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 ( dublu x , dublu y ){ return x / y ;} } /// <summary> /// Proxy este un proxy /// </summary> /// <remarks> /// <li> /// <lu> stochează o referință care permite proxy-ului să se refere la real /// subiect . Obiectul de clasă <see cref="MathProxy"/> se poate referi la obiectul de clasă /// <see cref="IMath"/> dacă interfețele de clasă <see cref="Math"/> și <see cref="IMath"/> sunt aceleași;</lu> /// <lu>oferă o interfață identică cu cea a <see cref="IMath"/>, astfel încât un proxy /// poate fi întotdeauna furnizat în locul subiectului real;</ lu> /// < lu>controlează accesul la subiectul real și poate fi responsabil pentru crearea /// și ștergerea acestuia;</lu> /// <lu>alte sarcini depind de tipul de proxy: /// < li> /// <lu><b >proxy la distanță</b> este responsabil pentru codificarea cererii și argumentele acesteia /// și trimiterea cererii codificate către subiectul real /// într-un spațiu de adrese diferit;</lu > /// <lu><b>proxy virtual</b> poate stoca în cache informații /// suplimentare despre subiectul real pentru a întârzia crearea acestuia.</lu> /// <lu><b>protecția proxy</b> > verifică dacă apelantul /// are permisiunile necesare pentru a face cererea; </lu> /// </li> /// </lu> /// </li> /// < /remarks> class MathProxy : IMath { Math math ; public MathProxy () { math = null ; } /// <summary> /// Operare rapidă - nu necesită un subiect real /// </summary> /// <param name="x"></param> /// <param name="y" ></param> /// <returns></returns> public double Add ( double x , double y ) { return x + y ; } public double Sub ( dublu x , dublu y ) { return x - y ; } /// <summary> /// Operare lentă - necesită crearea unui subiect real /// </summary> /// <param name="x"></param> /// <param name="y" ></param> /// <returns></returns> public double Mul ( double x , double y ) { if ( math == null ) math = new Math (); întoarce matematica . Mul ( x , y ); } public double Div ( double x , double y ) { if ( math == null ) math = new Math (); întoarce matematica . Div ( x , y ); } }

JavaScript

Exemplu de implementare /* Subiect */ clasa IMath { add ( x , y ) {} sub ( x , y ) {} } /* Subiect real */ class RMath extinde IMath { add ( x , y ) { return x + y ; } sub ( x , y ) { return x - y ; } } /* Proxy */ clasa MathProxy extinde IMath { math = nou RMath () add ( x , y ) { return this . matematica . adaugă ( x , y ) } sub ( x , y ) { return this . matematica . sub ( x , y ) } } test const = alertă MathProxy () nouă ( test . adăugare ( 3 , 2 )) // 5 alertă ( test . sub ( 3 , 2 )) // 1

Ruby

Exemplu de implementare modulul ProxyPattern # Proxy are aceeași interfață ca un subiect real # Real Subject class Account attr_reader :balance def initialize ( sold = 0 ) @balance = sold final def depozit ( suma ) @balance += suma finală def retrage ( suma ) @balance -= suma finală sfârșit Modul Protecție # Funcționalitate suplimentară pentru controlul accesului la subiectul real # Clasa proxy AccountProxy def initialize ( subiect , utilizator_actual ) @subject = subiect @utilizator_actual = utilizator_actual @balance = 0 final depozit def ( sumă ) @subiect . depozit ( suma ) dacă se autorizează încheierea def retrage ( suma ) @subiect . retrage ( suma ) dacă se încheie autorizarea def echilibru @subject . sfârșitul echilibrului privat def authorize pune „Acces refuzat”, cu excepția cazului în care @current_user == admin” @current_user == „admin” end end def sine . run pune „=> Proxy::Protection” pune „ca utilizator” protected_account = AccountProxy . new ( Cont . nou , 'utilizator' ) protected_account . depozit ( 20 ) protected_account . retrage ( 10 ) pune protected_account . echilibru pune „ca admin” protected_account = AccountProxy . nou ( Cont . nou , 'admin' ) protected_account . depozit ( 20 ) protected_account . retrage ( 10 ) pune protected_account . echilibru pune '' end end modul Virtual # Întârziere încărcarea subiectului real (încărcare leneră) # Clasa proxy AccountProxy def initialize ( local_balance = 0 ) @local_balance = local_balance end def depozit ( suma ) @local_balance += suma finală def retrage ( suma ) @local_balance -= suma finală def echilibru subiect . sfârșitul echilibrului def subiect @subject ||= Cont . nou ( @local_balance ) _ _ def sine . run pune „=> Proxy::Virtual” local_account = AccountProxy . cont_local nou . depozit ( 20 ) cont_local . retrage ( 10 ) cont_local . depozit ( 15 ) cont_local . withdraw ( 5 ) pune „Nu există încă un cont real:” pune local_account . inspecta cont_local . sold puts „Contul real a fost creat:” pune local_account . inspecta pune '' end end def sine . rulați Protecția . runVirtual _ _ run end end

PHP5

Exemplu de implementare <?php /// Subiect - subiect /// definește o interfață comună între Math și "Proxy", astfel încât /// clasa "Proxy" poate fi folosită oriunde interfață IMath { function Add ( $x , $y ); funcția Sub ( $x , $y ); funcția Mul ( $x , $y ); funcția Div ( $x , $y ); } /// RealSubject - obiectul real /// definește obiectul real reprezentat de proxy class Math implementează IMath { public function __construct () { print ( "Creează obiect Math. Wait..." ); somn ( 5 ); } function public Add ( $x , $y ){ return $x + $y ;} public function Sub ( $x , $y ){ return $x - $y ;} public function Mul ( $x , $y ){ return $x * $y ;} funcție publică Div ( $x , $y ){ return $x / $y ;} } /// Proxy - proxy /// stochează un link care permite proxy-ului să se refere la subiectul /// real. Obiectul clasei „MathProxy” poate accesa obiectul clasei „Math” /// dacă interfețele claselor „Math” și „IMath” sunt aceleași; /// oferă o interfață identică cu interfața „IMath”, deci un proxy /// poate fi întotdeauna furnizat în locul subiectului real; /// controlează accesul la subiectul real și poate fi responsabil pentru crearea /// și ștergerea acestuia; /// alte sarcini depind de tipul de proxy: /// proxy-ul la distanță este responsabil pentru codificarea cererii și argumentele acesteia /// și trimiterea cererii codificate subiectului real /// într-un spațiu de adrese diferit; /// Proxy-ul virtual poate stoca /// informații suplimentare despre subiectul real pentru a întârzia crearea acestuia. /// proxy-ul de protecție verifică dacă apelantul /// are permisiunile necesare pentru a executa cererea; clasa MathProxy implementeaza IMath { protected $math ; function public __construct () { $this -> math = null ; } /// Operare rapidă - nu necesită o funcție publică subiect real Adaugă ( $ x , $ y ) { return $x + $y ; } function public Sub ( $x , $y ) { return $x - $y ; } /// Operare lentă - necesită crearea unei funcții publice subiect real Mul ( $x , $y ) { if ( $this -> math == null ) $this -> math = new Math (); return $this -> math -> Mul ( $x , $y ); } function public Div ( $x , $y ) { if ( $this -> math == null ) $this -> math = new Math (); return $this -> math -> Div ( $x , $y ); } } $p = nou MathProxy ; // Faceți imprimarea matematică ( "4 + 2 = " . $p -> Adaugă ( 4 , 2 )); print ( "4 - 2 = " . $p -> Sub ( 4 , 2 )); print ( "4 * 2 = " . $p -> Mul ( 4 , 2 )); print ( "4 / 2 = " . $p -> Div ( 4 , 2 )); ?>

ActionScript

Exemplu de implementare //fișier IMath.as pachet { interfață publică IMath { function add ( a : Număr , b : Număr ) : Număr ; function sub ( a : Număr , b : Număr ) : Număr ; function mul ( a : Număr , b : Număr ) : Număr ; function div ( a : Număr , b : Număr ) : Număr ; } } //fișier MathSubject.as pachet { public class MathSubject implementează IMath { public function add ( a : Number , b : Number ) : Number { return a + b ; } funcţia publică sub ( a : Număr , b : Număr ) : Număr { returnează a - b ; } public function mul ( a : Număr , b : Număr ) : Număr { return a * b ; } public function div ( a : Număr , b : Număr ) : Număr { return a / b ; } } } //fișier pachet MathProxy.as { public class MathProxy implementează IMath { private var math : MathSubject ; public function MathProxy () { math = new MathSubject (); } public function add ( a : Number , b : Number ) : Number { return math . adaugă ( a , b ); } funcția publică sub ( a : Număr , b : Număr ) : Număr { return math . sub ( a , b ); } public function mul ( a : Număr , b : Număr ) : Număr { return math . mul ( a , b ); } public function div ( a : Număr , b : Număr ) : Număr { dacă ( b != 0 ) returnează matematică . div ( a , b ); else { trace ( "Diviziunea la zero." ); returnNumber _ _ POSITIVE_INFINITY ; } } } } //file Main.as package { import flash.display.Sprite ; public class Main extinde Sprite { public function Main () { playWithMath ( new MathSubject ()); playWithMath ( nou MathProxy ()); } funcția publică playWithMath ( math : IMath ) : void { trace ( math . add ( 5 , 0 )); urmă ( math . sub ( 5 , 0 )); urmă ( math . mul ( 5 , 0 )); urmă ( math . div ( 5 , 0 )); } } }

Python

Exemplu de implementare # -*- codificare: utf-8 -*- class IMath : """Interfață pentru proxy și subiect real""" def add ( self , x , y ): raise NotImplementedError () def sub ( self , x , y ): raise NotImplementedError () def mul ( self , x , y ): raise NotImplementedError () def div ( self , x , y ): raise NotImplementedError () clasa Matematică ( IMath ): """ Subiect real """ def add ( self , x , y ): return x + y def sub ( self , x , y ): returnează x - y def mul ( self , x , y ): return x * y def div ( self , x , y ): returnează x / y clasa Proxy ( IMath ): """Proxy""" def __init__ ( self ): self . matematică = matematică () def add ( self , x , y ): returnează x + y def sub ( self , x , y ): returnează x - y def mul ( self , x , y ): return self . matematica . mul ( x , y ) def div ( self , x , y ): return float ( 'inf' ) if y == 0 else self . matematica . div ( x , y ) p = Proxy () x , y = 4 , 2 print '4 + 2 = ' + str ( p . adaugă ( x , y )) print '4 - 2 = ' + str ( p . sub ( x , y )) print '4 * 2 = ' + str ( p . mul ( x , y )) print '4 / 2 = ' + str ( p . div ( x , y ))

VB.NET

Exemplu de implementare Importuri System.Threading Class MainApp Shared Sub Main () ' Creare proxy matematic Dim p As IMath = New MathProxy () ' Fă Consola de matematică . WriteLine ( "4 + 2 = " & p . Adăugați ( 4 , 2 )) Consolă . WriteLine ( "4 - 2 = " & p . Subtr ( 4 , 2 )) Consolă . WriteLine ( "4 * 2 = " & p . Mul ( 4 , 2 )) Consolă . WriteLine ( "4 / 2 = " & p . Div ( 4 , 2 )) ' Așteptați Consola utilizator . Citiți () End Sub End Class ''' <summary> ''' Subiect - subiectul lui ''' </summary> ''' <remarks> ''' <li> ''' <lu> definește comun la <see cref="Math"/ > și interfața <see cref="Proxy"/>, astfel încât clasa ''' <see cref="Proxy"/> poate fi folosită oriunde <see cref="Math"/></lu> ''' </ li> ''' </remarks> Public Interface 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 Ca dublu ) Ca dublu Funcție Div ( ByVal x Ca dublu , ByVal și Ca dublu ) Ca interfață de capăt dublu ''' <summary> ''' RealSubject - obiectul real ''' </summary> ''' <remarks> ''' <li> ''' <lu>identifică obiectul real reprezentat de proxy</lu> > '' ' </li> ''' </remarks> Class Math Implementează IMath Public Sub New () Console . WriteLine ( "Creați obiectul Math. Așteptați..." ) Thread . Sleep ( 1000 ) End Sub Funcția publică Adaugă ( ByVal x As Double , ByVal y As Double ) As Double Implementează IMath . Adăugați funcția Return x + y End Funcția publică Subtr ( ByVal x As Double , ByVal y As Double ) As Double Implementează IMath . Subtr Return x - y End Function Funcția publică Mul ( ByVal x As Double , ByVal y As Double ) As Double Implementă IMath . Mul Return x * y End Function Public Function Div ( ByVal x As Double , ByVal y As Double ) As Double Implementă IMath . Div Return x / y End Function termina clasa ''' <summary> ''' Proxy proxy ''' </summary> ''' <remarks> ''' <li> ''' <lu> stochează o referință care permite proxy-ului să se refere la adevăratul '' ' subiect . Un obiect din clasa <see cref="MathProxy"/> se poate referi la un obiect din clasa ''' <see cref="IMath"/> dacă interfețele de clasă <see cref="Math"/> și <see cref= „IMath”/ > sunt aceleași;</lu> ''' <lu>oferă o interfață identică cu cea a lui <see cref="IMath"/>, astfel încât substituentul „'' poate fi întotdeauna furnizat în locul subiect real;</lu> ''' < lu>controlează accesul la subiectul real și poate fi responsabil pentru crearea ''' și ștergerea acestuia;</lu> ''' <lu>alte sarcini depind de tipul de proxy : ''' <li> ''' <lu><b >proxy-ul la distanță</b> este responsabil pentru codificarea cererii și a argumentelor sale ''' și trimiterea cererii codificate la subiectul real într-un spațiu de adrese diferit '' ';</lu> ''' <lu><b>proxy virtual</b> poate stoca în cache informații suplimentare ''' despre subiectul real pentru a întârzia crearea acestuia.</lu> ''' <lu><b> protecting proxy</b> verifică dacă apelantul ''' are permisiunile necesare pentru a face cererea; </lu> ''' </li> ''' </lu> ''' </li> ''' < /remarks> Clasa MathProxy implementează IMath Matematică privată As Math = Nimic ''' <summary> ''' Operare rapidă - nu necesită un subiect real ''' </summary> Funcție publică Adaugă ( ByVal x As Double , ByVal y As Double ) As Double Implementă IMath . Adăugați funcția Return x + y End Funcția publică Subtr ( ByVal x As Double , ByVal y As Double ) As Double Implementează IMath . Subtr Return x - y End Function ''' <summary> ''' Operațiune lentă - necesită crearea unui subiect real ''' </summary> Funcția publică Mul ( ByVal x As Double , ByVal y As Double ) As Double Implementă IMath . Mul Dacă matematica este nimic , atunci matematică = Matematică nouă () Sfârșit dacă Întoarce matematică . Mul ( x , y ) Funcție de sfârșit Public Function Div ( ByVal x As Double , ByVal y As Double ) As Double Implementă IMath . Div If math is Nothing Then math = New Math () End If Return math . Div ( x , y ) End Function End Class

Swift

Exemplu de implementare // se potrivește protocolul subiectului { 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 } // Clasa de subiect real MatchImp : Match { func add ( x : Int , y : Int ) -> Int { return x + y } func sub ( x : Int , y : Int ) -> Int { return x - y } func mul ( x : Int , y : Int ) -> Int { return x * y } func div ( x : Int , y : Int ) -> Int { return x / y } } // Clasa proxy MatchProxy : Potrivire { private let math = MatchImp () func add ( x : Int , y : Int ) -> Int { return math . adaugă ( 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 . mul ( x : x , y : y ) } func div ( x : Int , y : Int ) -> Int { return math . div ( x : x , y : y ) } } // utilizarea proxy let proxy = MatchProxy () print ( "7 * 8 = \( proxy . mul ( x : 8 , y : 7 )) " )

Vezi și

  • Programare post-obiect

Note

  1. Jurnalele dezvoltatorilor // Proxy (link descendent) . Consultat la 26 mai 2010. Arhivat din original pe 14 mai 2010. 

Literatură

  • CodeLIB.YOURS // Proxy Arhivat 14 mai 2010 la Wayback Machine
  • E. Gamma, R. Helm, R. Johnson, J. Vlissides . Tehnici de proiectare orientată pe obiecte. Design Patterns.=Design Patterns.Elemente ale software-ului reutilizabil orientat pe obiecte. - Sankt Petersburg. : Peter, 2001. - 368 p. — ISBN 5-272-00355-1 .
  • Eric Freeman, Elizabeth Freeman, Kathy Siera, Bert Bates. Modele de design. - Sankt Petersburg. : Peter, 2012. - 656 p. - ISBN 978-5-459-00435-9 .

Link -uri