Proxy pattern: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Luckas-bot (discussione | contributi)
m Bot: Aggiungo: ar:نمط الوكيل
m Altri progetti: Aggiunto il parametro "Preposizione" nel template "Interprogetto"
 
(32 versioni intermedie di 22 utenti non mostrate)
Riga 1:
{{T|lingua=inglese|argomento=informatica|data=giugno 2008}}
 
 
In [[informatica]], il '''proxy pattern''' è un [[design pattern]].
 
Un proxy, nellaNella sua forma più generale, un proxy è una classe che funziona come interfaccia per qualcos'altro. L'altro potrebbe essere qualunque cosa: una connessione di rete, un grosso oggetto in memoria, un file e altre risorse che sono costose o impossibili da duplicare.
 
Un esempio ben conosciuto di proxy pattern è l'oggettola tecnica [[reference counting]] dei [[Puntatore (programmazione)|puntatori]].
 
Nelle situazioni in cui molte copie di un oggetto complesso devono esistere, il proxy pattern può essere adottato per incorporare il [[Flyweight pattern]] per ridurre l'occupazione di memoria dell'oggetto. Tipicamente viene creata un'istanza di oggetto complesso, e molteplici oggetti proxy, ognuno dei quali contiene un riferimento al singolo oggetto complesso. Ogni operazione viene svolta sui proxy viene trasmessa all'oggetto originale. UnUna volta che tutte le istanze del proxy sono distrutte, l'oggetto in memoria può essere deallocato.
 
==Diagramma==
Line 16 ⟶ 13:
===Virtual proxy (in Java)===
 
Il seguente esempio [[Java (linguaggio di programmazione)|Java]] illustra il pattern "virtual proxy". L'output del programma è:
Loading HiRes_10MB_Photo1
Displaying HiRes_10MB_Photo1
Loading HiRes_10MB_Photo2
Displaying HiRes_10MB_Photo2
Displaying HiRes_10MB_Photo1
Displaying HiRes_10MB_Photo2
Loading HiRes_10MB_Photo3
Displaying HiRes_10MB_Photo3
 
La [[Classe_%28informatica%29Classe (informatica)|classe]] <code>ProxyImage</code> è utilizzata per ritardare l'operazione (onerosa) di caricamento di un [[file]] dal disco finché il risultato di questa operazione non è effettivamente necessario. Se il file non è mai necessario, il caricamento risulta essere completamente eliminato.
 
<syntaxhighlight lang="java">
<!--The <code>ProxyImage</code> class is used to delay the expensive operation of loading a file from disk until the result of that operation is actually needed. If the file is never needed, then the expensive load has been totally eliminated. -->
<source lang="java">
import java.util.*;
Line 44 ⟶ 43:
// ...
System.out.println("Loading "+filename);
 
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
 
Line 51 ⟶ 56:
class ProxyImage implements Image {
private String filename;
private ImageRealImage image;
public ProxyImage(String filename) { this.filename = filename; }
Line 65 ⟶ 70:
public static void main(String[] args) {
Image image1 = new ProxyImage("HiRes_10MB_Photo1");
Image image2 = new ProxyImage("HiRes_10MB_Photo2");
Image image3 = new ProxyImage("HiRes_10MB_Photo3");
 
image1.displayImage(); // loading necessary
image2.displayImage(); // loading necessary
image1.displayImage(); // no loading necessary; already done
image2.displayImage(); // no loading necessary; already done
image3.displayImage(); // loading necessary
// the third image will never be loaded - time saved!
}
}
</syntaxhighlight>
</source>
 
===Protection proxy (in C#)===
 
In questo esempio scritto in [[Linguaggio_C_SharpLinguaggio C Sharp|C#]], nella classe <code>RealClient</code> è memorizzato un numero di conto. Soltanto gli utenti che conoscono una [[password]] valida possono accedere a questo conto. Il <code>RealClient</code> è protetto dal <code>ProtectionProxy</code> che conosce la password. Prima di far leggere il numero di conto all'utente, il proxy richiede che questi si autentichi; Solo se la password introdotta è corretta il proxy invoca il <code>RealClient</code> per restituire il numero di conto all'utente.
 
In questo esempio '''thePassword''' è la password corretta
 
<syntaxhighlight lang="csharp">
<!--
In this [[C Sharp (programming language)|C#]] example, the <code>RealClient</code> stores an account number. Only users who know a valid password can access this account number. The <code>RealClient</code> is protected by a <code>ProtectionProxy</code> which knows the password. If a user wants to get an account number, first the proxy asks the user to authenticate; only if the user entered a correct password does the proxy invoke the <code>RealClient</code> to get an account number for the user.
 
In this example, '''thePassword''' is the correct password. -->
<source lang="csharp">
using System;
 
Line 105 ⟶ 107:
}
}
 
public class ProtectionProxy : IClient
{
Line 144 ⟶ 145:
}
}
</syntaxhighlight>Segue lo stesso esempio implementato in [[Java (linguaggio di programmazione)|Java]], in questo caso le implementazioni dell'interfaccia <code>Client</code> sono <code>RealClientImpl</code> e <code>ProtectionProxyClientImpl</code> .<syntaxhighlight lang="java">
</source>
package fundamentalPatterns.protectionProxyPattern;
 
import java.util.Scanner;
 
public interface Client {
String getAccountNo();
}
public class RealClientImpl implements Client {
private String accountNo = "12345";
public RealClientImpl() {
System.out.println("RealClient: Initialized");
}
@Override
public String getAccountNo() {
System.out.println("RealClient's AccountNo: " + accountNo);
return accountNo;
}
}
 
public class ProtectionProxyClientImpl implements Client {
private String password; //password to get secret
private Client client;
private Scanner scanner = new Scanner(System.in);
 
public ProtectionProxyClientImpl(String pwd) {
System.out.println("ProtectionProxy: Initialized");
password = pwd;
client = new RealClientImpl();
}
 
/**
* Authenticate the user and return the Account Number
*/
@Override
public String getAccountNo() {
System.out.print("Password: ");
String tmpPwd = scanner.nextLine();
 
if (password == null || password.equals(tmpPwd)) {
return client.getAccountNo();
} else {
System.out.println("ProtectionProxy: Illegal password!");
return "";
}
}
}
public class ProtectionProxyExample {
public static void main(String[] args) {
Client client = new ProtectionProxyClientImpl("thePassword");
System.out.println();
System.out.println("main received: " + client.getAccountNo());
}
}
</syntaxhighlight>
 
== Voci correlate ==
* [[Design pattern]]
 
==Altri progetti==
==Collegamenti esterni==
{{interprogetto|preposizione=sul}}
*{{en}} [http://wiki.java.net/bin/view/Javapedia/ProxyPattern Proxy pattern in Java]
*{{en}} [http://www.lepus.org.uk/ref/companion/Proxy.xml Proxy pattern in UML e in LePUS3 (un linguaggio di modellazione formale)]
 
==Collegamenti esterni==
{{Design Patterns Patterns}}
*{{cita web|1=http://wiki.java.net/bin/view/Javapedia/ProxyPattern|2=Proxy pattern in Java|lingua=en|accesso=11 giugno 2008|urlarchivio=https://web.archive.org/web/20100428080722/http://wiki.java.net/bin/view/Javapedia/ProxyPattern|dataarchivio=28 aprile 2010|urlmorto=sì}}
*{{cita web|1=http://www.lepus.org.uk/ref/companion/Proxy.xml|2=Proxy pattern in UML e in LePUS3 (un linguaggio di modellazione formale)|lingua=en|accesso=11 giugno 2008|urlarchivio=https://web.archive.org/web/20111003001610/http://www.lepus.org.uk/ref/companion/Proxy.xml|dataarchivio=3 ottobre 2011|urlmorto=sì}}
 
{{Design pattern}}
[[Categoria:Pattern]]
 
[[Categoria:Design pattern]]
[[ar:نمط الوكيل]]
[[bg:Пълномощно (шаблон)]]
[[ca:Proxy (patró de disseny)]]
[[de:Stellvertreter (Entwurfsmuster)]]
[[en:Proxy pattern]]
[[es:Proxy (patrón de diseño)]]
[[fr:Proxy (patron de conception)]]
[[ja:Proxy パターン]]
[[lt:Proxy (objektas)]]
[[pl:Pełnomocnik (wzorzec projektowy)]]
[[pt:Proxy (padrões de projeto)]]
[[ru:Proxy (шаблон проектирования)]]
[[uk:Замісник (шаблон проектування)]]