Stedfortræder (designmønster)

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 10. juli 2018; checks kræver 9 redigeringer .
Stedfortræder
proxy
Type strukturel
Formål Giver et surrogatobjekt, der styrer adgangen til et andet objekt.
fordele
  •  fjerntliggende erstatning;
  •  den virtuelle proxy kan udføre optimeringen;
  •  beskyttende erstatning;
  • "smart" link;
Minusser
  • dramatisk stigning i responstid.
Beskrevet i Design Patterns Ja

Proxy ( Eng.  Proxy ) er et strukturelt designmønster, der giver et objekt , der styrer adgangen til et andet objekt, opsnapper alle opkald (udfører funktionen som en container ).

Formål

Problem

Adgang til objektet skal kontrolleres uden at ændre klientens adfærd. 

Det er nødvendigt at få adgang til objektet på en sådan måde, at du ikke opretter rigtige objekter direkte, men gennem et andet objekt, der kan have yderligere funktionalitet.

Løsning

Opret et surrogat til et rigtigt objekt. Proxyen gemmer en reference, der tillader Proxyen at henvise til det rigtige subjekt (et objekt i Proxy-klassen kan henvise til et objekt fra Subject-klassen, hvis grænsefladerne mellem det rigtige subjekt og Subjektet er de samme). Da grænsefladen "Reelt Emne" er identisk med "Emne"-grænsefladen, således at "Erstatningen" kan erstattes af "Reelt Emne", kontrollerer adgangen til det "Reelle Emne", kan være ansvarlig for at oprette eller slette " Virkeligt emne". "Subject" definerer en fælles grænseflade mellem "Real Subject" og "Proxy", så "Proxy" kan bruges overalt, hvor "Real Subject" forventes. Om nødvendigt kan anmodninger videresendes af "Suppleant" til "Reelt Subjekt".

Arter

Fordele og ulemper ved at bruge

Fordele

Ulemper

Omfang

Proxy-mønsteret kan bruges, når du arbejder med en netværksforbindelse, med et stort objekt i hukommelsen (eller på disken), eller med enhver anden ressource, der er svær eller svær at kopiere. Et velkendt use case er et objekt, der tæller antallet af referencer.

Proxy og relaterede mønstre [1]

Implementeringseksempler

Java

Implementeringseksempel offentlig klasse Main { public static void main ( String [] args ) { // Create math proxy IMath p = new MathProxy (); // Gør det matematiske system . ud . println ( "4 + 2 = " + s . add ( 4 , 2 )); System . ud . println ( "4 - 2 = " + p . sub ( 4 , 2 )); System . ud . println ( "4 * 2 = " + p . mul ( 4 , 2 )); System . ud . println ( "4/2 = " + s . div ( 4 , 2 )); } } /** * "Emne" */ offentlig grænseflade IMath { offentlig dobbelttilføj ( dobbelt x , dobbelt y ) ; offentlig dobbelt sub ( dobbelt x , dobbelt y ); offentlig dobbelt mul ( dobbelt x , dobbelt y ); offentlig dobbelt div ( dobbelt x , dobbelt y ); } /** * "Reelt emne" */ offentlig klasse Math implementerer IMath { 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 ; } offentlig dobbelt div ( dobbelt x , dobbelt y ) { return x / y ; } } /** * "Proxy Object" */ public class MathProxy implementerer IMath { privat matematik matematik ; public double add ( double x , double y ) { lazyInitMath (); returnere matematik . tilføje ( x , y ); } public double sub ( double x , double y ) { lazyInitMath (); returnere matematik . sub ( x , y ); } offentlig dobbelt mul ( dobbelt x , dobbelt y ) { lazyInitMath (); returnere matematik . mul ( x , y ); } offentlig dobbelt div ( dobbelt x , dobbelt y ) { lazyInitMath (); returnere matematik . div ( x , y ); } private void lazyInitMath () { if ( math == null ) { math = new Math (); } } }

scala

Implementeringseksempel objekt Hoved udvider App { val p : IMath = nyt MathProxy System . ud . println ( "4 + 2 = " + s . add ( 4 , 2 )) System . ud . println ( "4 - 2 = " + s . sub ( 4 , 2 )) System . ud . println ( "4 * 2 = " + p . mul ( 4 , 2 )) System . ud . println ( "4/2 = " + s . div ( 4 , 2 )) } /** * "Subject" */ trait IMath { def add ( x : Double , y : Double ): Double def sub ( x : Dobbelt , y : Dobbelt ): Dobbelt def mul ( x : Dobbelt , y : Dobbelt ): Dobbelt def div ( x : Dobbelt , y : Dobbelt ): Dobbelt } /** * "Reelt emne" */ klasse Math udvider IMath { def add ( x : Double , y : Double ) = x + y def sub ( x : Dobbelt , y : Dobbelt ) = x - y def mul ( x : Dobbelt , y : Dobbelt ) = x * y def div ( x : Dobbelt , y : Dobbelt ) = x / y } /** * "Proxy Object" */ klasse MathProxy udvider IMath { private lazy val math = new Math def add ( x : Double , y : Double ) = matematik . tilføje ( x , y ) def sub ( x : Dobbelt , y : Dobbelt ) = matematik . sub ( x , y ) def mul ( x : Dobbelt , y : Dobbelt ) = matematik . mul ( x , y ) def div ( x : Dobbelt , y : Dobbelt ) = matematik . div ( x , y ) }

C++

Implementeringseksempel /** * "Emne" */ klasse IMath { offentligt : virtuel dobbelt add ( dobbelt , dobbelt ) = 0 ; virtuel dobbelt sub ( dobbelt , dobbelt ) = 0 ; virtuel dobbelt mul ( dobbelt , dobbelt ) = 0 ; virtuel dobbelt div ( dobbelt , dobbelt ) = 0 ; }; /** * "Reelt emne" */ klasse Math : public IMath { offentligt : virtuel dobbelttilføj ( dobbelt x , dobbelt y ) { _ returner x + y _ } virtual double sub ( double x , double y ) { returnere x - y ; } virtuel dobbelt mul ( dobbelt x , dobbelt y ) { returner x * y _ } virtuel dobbelt div ( dobbelt x , dobbelt y ) { returnere x / y _ } }; /** * "Proxyobjekt" */ klasse MathProxy : public IMath { offentligt : MathProxy () { matematik = ny matematik (); } virtuel ~ MathProxy () { slet matematik ; } virtuel dobbelttilføj ( dobbelt x , dobbelt y ) { _ returnere matematik -> tilføje ( x , y ); } virtual double sub ( double x , double y ) { returnere matematik -> sub ( x , y ); } virtuel dobbelt mul ( dobbelt x , dobbelt y ) { returnere matematik -> mul ( x , y ); } virtuel dobbelt div ( dobbelt x , dobbelt y ) { returnere matematik -> div ( x , y ); } privat : IMath * matematik ; }; #include <iostream> bruger std :: cout ; bruger std :: endl ; int main () { // Opret matematisk proxy IMath * proxy = ny MathProxy (); // Udfør matematikken << "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 ; slet proxy ; returnere 0 ; }

C#

Implementeringseksempel bruger System ; ved hjælp af System.Threading ; klasse MainApp { static void Main () { // Create math proxy IMath p = new MathProxy (); // Gør matematikkonsollen . WriteLine ( "4 + 2 = " + p . Tilføj ( 4 , 2 )); Konsol . WriteLine ( "4 - 2 = " + p . Sub ( 4 , 2 )); Konsol . WriteLine ( "4 * 2 = " + p . Mul ( 4 , 2 )); Konsol . WriteLine ( "4 / 2 = " + p . Div ( 4 , 2 )); // Vent på brugerkonsollen . læs (); } } /// <resumé> /// Emne - emne /// </summary> /// <remarks> /// <li> /// <lu> definerer en fælles for <see cref="Math"/> og <see cref="Proxy"/> interface, så klasse /// <see cref="Proxy"/> kan bruges hvor som helst <see cref="Math"/></lu> /// </ li> / // </remarks> offentlig grænseflade IMath { double Add ( double x , double y ); dobbelt Sub ( dobbelt x , dobbelt y ); dobbelt Mul ( dobbelt x , dobbelt y ); dobbelt Div ( dobbelt x , dobbelt y ); } /// <resumé> /// RealSubject - real object /// </summary> /// <remarks> /// <li> /// <lu>definerer det reelle objekt repræsenteret af proxyen</lu> // / </li> /// </remarks> klasse Math : IMath { public Math () { Console . WriteLine ( "Opret objekt Math. Vent..." ); tråd . Søvn ( 1000 ); } public double Tilføj ( 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 ( double x , double y ) { return x / y ;} } /// <resumé> /// Proxy er en proxy /// </summary> /// <remarks> /// <li> /// <lu> gemmer en reference, der tillader proxyen at henvise til den rigtige /// emne. Klasseobjekt <see cref="MathProxy"/> kan henvise til klasseobjekt /// <see cref="IMath"/> hvis klassegrænseflader <see cref="Math"/> og <see cref="IMath"/ > er de samme;</lu> /// <lu>giver en grænseflade, der er identisk med den for <see cref="IMath"/>, så en proxy /// altid kan leveres i stedet for det rigtige emne;</ lu> /// < lu>kontrollerer adgangen til det rigtige emne og kan være ansvarlig for at oprette /// og slette det;</lu> /// <lu>andre pligter afhænger af typen af ​​proxy: /// < li> /// <lu><b >fjern proxy</b> er ansvarlig for at kode anmodningen og dens argumenter /// og sende den kodede anmodning til det rigtige emne /// i et andet adresserum;</lu > /// <lu><b>virtuel proxy</b> kan cache yderligere /// oplysninger om det reelle emne for at forsinke dets oprettelse.</lu> /// <lu><b>beskyttende proxy</b > kontrollerer, om den, der ringer op /// har de nødvendige tilladelser til at foretage anmodningen; </lu> /// </li> /// </lu> /// </li> /// < /remarks> class MathProxy : IMath { Math math ; public MathProxy () { math = null ; } /// <resumé> /// Hurtig betjening - kræver ikke et rigtigt emne /// </summary> /// <param name="x"></param> /// <param name="y" >< /param> /// <returns></returns> public double Tilføj ( double x , double y ) { return x + y ; } public double Sub ( double x , double y ) { return x - y ; } /// <summary> /// Langsom drift - kræver oprettelse af et rigtigt emne /// </summary> /// <param name="x"></param> /// <param name="y" >< /param> /// <returns></returns> public double Mul ( double x , double y ) { if ( math == null ) math = new Math (); returnere matematik . Mul ( x , y ); } public double Div ( double x , double y ) { if ( math == null ) math = new Math (); returnere matematik . Div ( x , y ); } }

JavaScript

Implementeringseksempel /* Emne */ klasse IMath { add ( x , y ) {} sub ( x , y ) {} } /* Real Subject */ class RMath udvider IMath { add ( x , y ) { return x + y ; } sub ( x , y ) { returner x - y ; } } /* Proxy */ klasse MathProxy udvider IMath { math = new RMath () add ( x , y ) { returner dette . matematik . add ( x , y ) } sub ( x , y ) { returner dette . matematik . sub ( x , y ) } } const test = new MathProxy () advarsel ( test . add ( 3 , 2 )) // 5 alert ( test . sub ( 3 , 2 )) // 1

Ruby

Implementeringseksempel modul ProxyPattern # Proxy har den samme grænseflade som et rigtigt emne # Real Subject class Account attr_reader :balance def initialize ( balance = 0 ) @balance = balance end def indbetaling ( beløb ) @saldo += beløb slut def tilbagetrækning ( beløb ) @saldo -= beløb slut slut modul Beskyttelse # Yderligere funktionalitet til at kontrollere adgangen til det virkeligeSubject # Proxy -klasse AccountProxy def initialize ( subject , current_user ) @subject = subject @current_user = current_user @balance = 0 end def indbetaling ( beløb ) @subject . depositum ( beløb ) hvis autorisation afsluttes def tilbagetrækning ( beløb ) @emne . trække ( beløb ) hvis autorisation afsluttes def balance @emne . balance ende privat def autorisere sætter 'Adgang nægtet', medmindre @current_user == ' admin ' @current_user == 'admin' slutningen def selv . køre sætter '=> Proxy::Protection' sætter 'som bruger' protected_account = AccountProxy . ny ( Konto . ny , 'bruger' ) protected_account . depositum ( 20 ) protected_account . trække ( 10 ) sætter beskyttet_konto . balance sætter 'som admin' protected_account = AccountProxy . ny ( Account . new , 'admin' ) protected_account . depositum ( 20 ) protected_account . trække ( 10 ) sætter beskyttet_konto . balance sætter ' ' ende modul Virtuel # Forsinket reel indlæsning af emne (doven indlæsning) # Proxy klasse AccountProxy def initialize ( local_balance = 0 ) @local_balance = local_balance end def indbetaling ( beløb ) @local_balance += beløb slut def tilbagetrækning ( beløb ) @local_balance -= beløb slut def balance emne . balance ende def emne @subject ||= Konto . ny ( @lokal_balance ) _ _ def selv . køre sætter '=> Proxy::Virtual' local_account = AccountProxy . ny lokal_konto . indbetaling ( 20 ) lokal_konto . trække ( 10 ) lokal_konto . indbetaling ( 15 ) lokal_konto . trække ( 5 ) sætter 'Ingen rigtig konto endnu:' sætter local_account . inspicere lokal_konto . saldo sætter 'Reel konto blev oprettet:' sætter lokal_konto . inspicere sætter ' ' ende def selv . køre beskyttelse . runVirtual . _ løb ende ende

PHP5

Implementeringseksempel <?php /// Emne - emne /// definerer en fælles grænseflade mellem Math og "Proxy", så /// "Proxy"-klassen kan bruges hvor som helst grænseflade IMath { function Add ( $x , $y ); funktion Sub ( $x , $y ); funktion Mul ( $x , $y ); funktion Div ( $x , $y ); } /// RealSubject - det rigtige objekt /// definerer det rigtige objekt repræsenteret af proxyen klasse Math implementerer IMath { public function __construct () { print ( "Create object Math. Vent..." ); søvn ( 5 ); } public function Add ( $x , $y ){ return $x + $y ;} public function Sub ( $x , $y ){ return $x - $y ;} public function Mul ( $x , $y ){ return $x * $y ;} offentlig funktion Div ( $x , $y ){ return $x / $y ;} } /// Proxy - proxy /// gemmer et link, der tillader proxyen at henvise til det rigtige /// emne. Klasseobjektet "MathProxy" kan få adgang til klasseobjektet " Math" ///, hvis grænsefladerne for "Math"- og "IMath"-klasserne er de samme; /// giver en grænseflade, der er identisk med "IMath"-grænsefladen, så en proxy /// kan altid leveres i stedet for det rigtige emne; /// kontrollerer adgangen til det rigtige emne og kan være ansvarlig for at oprette /// og slette det; /// andre pligter afhænger af typen af ​​proxy: /// den eksterne proxy er ansvarlig for at kode anmodningen og dens argumenter /// og sende den kodede anmodning til det rigtige emne /// i et andet adresserum; /// Den virtuelle proxy kan cache yderligere /// information om det virkelige emne for at forsinke dets oprettelse. /// den beskyttende proxy kontrollerer, om opkalderen /// har de nødvendige tilladelser til at udføre anmodningen; klasse MathProxy implementerer IMath { protected $math ; offentlig funktion __construct () { $this -> math = null ; } /// Hurtig betjening - kræver ikke en ægte subjekt public funktion Tilføj ( $x , $y ) { return $x + $y ; } public function Sub ( $x , $y ) { return $x - $y ; } /// Langsom drift - kræver oprettelse af en reelt emne public funktion Mul ( $x , $y ) { if ( $this -> math == null ) $this -> math = new Math (); returner $this -> matematik -> Mul ( $x , $y ); } public function Div ( $x , $y ) { if ( $this -> math == null ) $this -> math = new Math (); return $this -> matematik -> Div ( $x , $y ); } } $p = ny MathProxy ; // Udskriv matematikken ( "4 + 2 = " . $p -> Tilføj ( 4 , 2 )); print ( "4 - 2 = " . $p -> Sub ( 4 , 2 )); print ( "4 * 2 = " . $p -> Mul ( 4 , 2 )); print ( "4 / 2 = " . $p -> Div ( 4 , 2 )); ?>

ActionScript

Implementeringseksempel //file IMath.as package { public interface IMath { function add ( a : Number , b : Number ) : Number ; funktion sub ( a : Tal , b : Tal ) : Tal ; funktion mul ( a : Tal , b : Tal ) : Tal ; funktion div ( a : Tal , b : Tal ) : Tal ; } } //file MathSubject.as package { public class MathSubject implementerer IMath { public function add ( a : Number , b : Number ) : Number { return a + b ; } public function sub ( a : Tal , b : Tal ) : Tal { retur a - b ; } offentlig funktion mul ( a : Tal , b : Tal ) : Tal { retur a * b ; } public function div ( a : Tal , b : Tal ) : Tal { return a / b ; } } } //file MathProxy.as pakke { public class MathProxy implementerer IMath { private var math : MathSubject ; offentlig funktion MathProxy () { math = nyt MathSubject (); } offentlig funktion add ( a : Tal , b : Tal ) : Tal { retur matematik . tilføje ( a , b ); } public function sub ( a : Tal , b : Tal ) : Tal { retur matematik . sub ( a , b ); } offentlig funktion mul ( a : Tal , b : Tal ) : Tal { retur matematik . mul ( a , b ); } offentlig funktion div ( a : Tal , b : Tal ) : Tal { if ( b != 0 ) returnerer matematik . div ( a , b ); else { trace ( "Division med nul." ); returnummer . _ POSITIVE_INFINITY ; } } } } //file Main.as- pakke { import flash.display.Sprite ; public class Main udvider Sprite { public function Main () { playWithMath ( new MathSubject ()); playWithMath ( ny MathProxy ()); } public function playWithMath ( math : IMath ) : void { trace ( math . add ( 5 , 0 )); spore ( matematik . sub ( 5 , 0 )); spore ( matematik . mul ( 5 , 0 )); spore ( matematik . div ( 5 , 0 )); } } }

Python

Implementeringseksempel # -*- kodning: utf-8 -*- class IMath : """Grænseflade for proxy og reelt emne""" def add ( self , x , y ): raise NotImplementedError () def sub ( selv , x , y ): raise NotImplementedError () def mul ( selv , x , y ): raise NotImplementedError () def div ( selv , x , y ): raise NotImplementedError () klasse Math ( IMath ): """Reelt emne""" def add ( selv , x , y ): returner x + y def sub ( selv , x , y ): returner x - y def mul ( selv , x , y ): returner x * y def div ( selv , x , y ): returner x / y klasse Proxy ( IMath ): """Proxy""" def __init__ ( selv ): selv . matematik = matematik () def add ( selv , x , y ): returner x + y def sub ( selv , x , y ): returner x - y def mul ( selv , x , y ): returnere selv . matematik . mul ( x , y ) def div ( selv , x , y ): returnere float ( 'inf' ) hvis y == 0 andet selv . matematik . div ( x , y ) p = Proxy () x , y = 4 , 2 print '4 + 2 = ' + str ( p . add ( x , y )) print '4 - 2 = ' + str ( p . sub ( x , y )) print '4 * 2 = ' + str ( p . mul ( x , y )) udskriv '4 / 2 = ' + str ( p . div ( x , y ))

VB.NET

Implementeringseksempel Importer System.Threading Klasse MainApp Shared Sub Main () ' Opret matematisk proxy Dim p As IMath = New MathProxy () Udfør matematikkonsollen . WriteLine ( "4 + 2 = " & s . Tilføj ( 4 , 2 )) Konsol . WriteLine ( "4-2 = " & p . Subtr ( 4 , 2 )) Konsol . WriteLine ( "4 * 2 = " & p . Mul ( 4 , 2 )) Konsol . WriteLine ( "4 / 2 = " & s . Div ( 4 , 2 )) 'Vent på brugerkonsollen . Læs () End Sub End Class ''' <summary> ''' Emne - emnet for ''' </summary> ''' <remarks> ''' <li> ''' <lu> definerer fælles for <see cref="Math"/ > og <see cref="Proxy"/> interface, så klassen ''' <see cref="Proxy"/> kan bruges hvor som helst <see cref="Math"/></lu> ''' </ li> ''' </remarks> Offentlig grænseflade IMath Funktion Tilføj ( 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 ) Som Dobbeltfunktion Div ( ByVal x As Double , ByVal y As Double ) Som Double End Interface _ ''' <summary> ''' RealSubject - det rigtige objekt ''' </summary> ''' <remarks> ''' <li> ''' <lu>identificerer det rigtige objekt repræsenteret af proxyen</lu > '' ' </li> ''' </remarks > Klassematematik implementerer IMath Offentlig under ny () konsol . WriteLine ( "Opret objekt Math. Vent..." ) Tråd . Søvn ( 1000 ) End Sub Public Function Add ( ByVal x As Double , ByVal y As Double ) As Double Implementer IMath . Tilføj Retur x + y Slutfunktion _ Public Function Subtr ( ByVal x As Double , ByVal y As Double ) As Double Implementer IMath . Subtr Return x - y Slutfunktion _ Public Function Mul ( ByVal x As Double , ByVal y As Double ) As Double Implementer IMath . Mul Return x * y Slutfunktion _ Offentlig funktion Div ( ByVal x As Double , ByVal y As Double ) As Double Implementer IMath . Div Return x / y Slutfunktion _ slutklasse _ ''' <summary> ''' Proxy proxy ''' </summary> ''' <remarks> ''' <li> ''' <lu> gemmer en reference, der tillader proxyen at henvise til den rigtige '' ' emne. Et objekt af klassen <see cref="MathProxy"/> kan henvise til et objekt af klassen ''' <see cref="IMath"/>, hvis klassen interfacer <see cref="Math"/> og <see cref= "IMath"/ > er de samme;</lu> ''' <lu>giver en grænseflade, der er identisk med den for <see cref="IMath"/>, så pladsholderen ''' altid kan angives i stedet for ægte emne;</lu> ''' < lu>kontrollerer adgangen til det rigtige emne og kan være ansvarlig for dets oprettelse ''' og sletning;</lu> ''' <lu>andre pligter afhænger af typen af ​​fuldmægtig : ''' <li> ''' <lu><b >fjernproxy</b> er ansvarlig for at kode anmodningen og dens argumenter ''' og sende den kodede anmodning til det rigtige emne i et andet adresseområde '' ';</lu> ''' <lu><b>virtuel proxy</b> kan cache yderligere information ''' om det virkelige emne for at forsinke dets oprettelse.</lu> ''' <lu><b> beskyttende proxy</b> kontrollerer, om den, der ringer ''' har de nødvendige tilladelser til at fremsætte anmodningen; </lu> ''' </li> ''' </lu> ''' </li> ''' < /bemærkninger> Klasse MathProxy implementerer IMath Privat matematik Som matematik = ingenting ''' <resumé> ''' Hurtig betjening - kræver ikke et rigtigt emne ''' </summary> Offentlig funktion Tilføj ( ByVal x As Double , ByVal y As Double ) As Double Implementerer IMath . Tilføj Retur x + y Slutfunktion _ Public Function Subtr ( ByVal x As Double , ByVal y As Double ) As Double Implementer IMath . Subtr Return x - y Slutfunktion _ ''' <summary> ''' Langsom drift - kræver oprettelse af et rigtigt emne ''' </summary> Public Function Mul ( ByVal x As Double , ByVal y As Double ) As Double Implementerer IMath . Mul Hvis matematik ikke er noget , matematik = Ny matematik () End If Returner matematik . Mul ( x , y ) Slutfunktion _ Offentlig funktion Div ( ByVal x As Double , ByVal y As Double ) As Double Implementer IMath . Div Hvis matematik ikke er noget , matematik = Ny matematik () End If Returner matematik . Div ( x , y ) Slutfunktion Slutklasse _ _

Swift

Implementeringseksempel // emneprotokol match { 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 } // Real Subject class 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 } } // Proxy klasse MatchProxy : Match { private lad math = MatchImp () func add ( x : Int , y : Int ) -> Int { return math . tilføje ( x : x , y : y ) } func sub ( x : Int , y : Int ) -> Int { returnere matematik . 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 { returnere matematik . div ( x : x , y : y ) } } // brug proxy lad proxy = MatchProxy () udskrive ( "7 * 8 = \( proxy . mul ( x : 8 , y : 7 )) " )

Se også

  • Post-objekt programmering

Noter

  1. Udviklerens dagbøger // Proxy (downlink) . Hentet 26. maj 2010. Arkiveret fra originalen 14. maj 2010. 

Litteratur

  • CodeLIB.YOURS // Proxy arkiveret 14. maj 2010 på Wayback Machine
  • E. Gamma, R. Helm, R. Johnson, J. Vlissides . Teknikker til objektorienteret design. Design Patterns.=Design Patterns.Elementer af genanvendelig objektorienteret software. - Sankt Petersborg. : Peter, 2001. - 368 s. — ISBN 5-272-00355-1 .
  • Eric Freeman, Elizabeth Freeman, Kathy Siera, Bert Bates. Design mønstre. - Sankt Petersborg. : Peter, 2012. - 656 s. - ISBN 978-5-459-00435-9 .

Links