Proxy pattern: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
cont trad |
m →Altri progetti: Aggiunto il parametro "Preposizione" nel template "Interprogetto" |
||
(43 versioni intermedie di 29 utenti non mostrate) | |||
Riga 1:
In [[informatica]], il '''proxy pattern''' è un [[design pattern]].
Un esempio ben conosciuto di proxy pattern è
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
==Diagramma==
[[
==Esempi==
Line 21 ⟶ 18:
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 (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">
import java.util.*;
Line 42 ⟶ 43:
// ...
System.out.println("Loading "+filename);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Line 49 ⟶ 56:
class ProxyImage implements Image {
private String filename;
private
public ProxyImage(String filename) { this.filename = filename; }
Line 63 ⟶ 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
}
}
</syntaxhighlight>
===Protection proxy
In questo esempio scritto in [[Linguaggio 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">
using System;
Line 98 ⟶ 107:
}
}
public class ProtectionProxy : IClient
{
Line 137 ⟶ 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">
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==
{{interprogetto|preposizione=sul}}
==Collegamenti esterni==
*{{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:Design pattern]]
|