Adapter pattern: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Botcrux (discussione | contributi)
m Bot: fix wl, replaced: Design Patterns patterns → Design pattern
 
(26 versioni intermedie di 22 utenti non mostrate)
Riga 1:
{{F|programmazione|febbraio 2013}}
Con il nome '''adapter''', o '''adattatore''' si denota un ''[[design pattern]]'' utilizzato in [[informatica]] nella [[programmazione orientata agli oggetti]]. A volte viene chiamato ''wrapper'' (ovvero ''involucro'') per il [[#Struttura|suo schema di funzionamento]].
Con il nome '''adapter''', o '''adattatore''' si denota un ''[[design pattern]]'' utilizzato in [[informatica]] nella [[programmazione orientata agli oggetti]]. A volte viene chiamato ''wrapper'' (ovvero ''involucro'') per il [[#Struttura|suo schema di funzionamento]].
 
Il fine dell'''adapter'' è di fornire una soluzione astratta al problema dell'interoperabilità tra interfacce differenti. Il problema si presenta ogni qual volta nel progetto di un ''[[software]]'' si debbano utilizzare sistemi di supporto (come per esempio [[Libreria (informaticasoftware)|librerie]]) la cui interfaccia non è perfettamente compatibile con quanto richiesto da applicazioni già esistenti. Invece di dover riscrivere parte del sistema, compito oneroso e non sempre possibile se non si ha a disposizione il [[codice sorgente]], può essere comodo scrivere un ''adapter'' che faccia da tramite.
 
L'''Adapter'' è un ''pattern'' strutturale che può essere basato sia su [[Classe (informatica)|classi]] che su [[Oggetto (informatica)|oggetti]].
 
Questo ''design pattern'' è parte fondamentale della programmazione a oggetti ed è stato formalizzato per la prima volta da [[Erich Gamma]], [[Richard Helm]], [[Ralph Johnson (informatico)|Ralph Johnson]] e [[John Vlissides]] - la cosiddetta ''[[gangGang of fourFour (scrittori)|Gang of Four]]'' - nel libro ''[[Design Patterns]]''.
 
==Applicabilità==
Line 16 ⟶ 17:
==Struttura==
{{S sezione|informatica}}
Il pattern ''Adapter'' può essere basato su classi, utilizzando l'[[ereditarietà (informatica)|ereditarietà]] multipla per adattare interfacce diverse con il meccanismo dell'ereditarietà, oppure sullasu composizioneoggetti dicon oggettila composition, ovvero includendo l’oggetto sorgente nell’implementazione dell’adapter..
<!--
===Basata su classi===
Line 35 ⟶ 36:
 
==Partecipanti==
[[File:Adapter_using_delegation_UML_class_diagramAdapter using delegation UML class diagram.pngsvg|thumb|350pxupright=1.6|Diagramma UML del Pattern]]
 
* '''Adaptee''': definisce l'interfaccia che ha bisogno di essere adattata.
Line 41 ⟶ 42:
* '''Client''': collabora con gli oggetti in conformità con l'interfaccia Target.
* '''Adapter''': adatta l'interfaccia Adaptee all'interfaccia Target.
 
== Esempi ==
===PHP===
<syntaxhighlight lang="php">
// Esempio Adapter Pattern
 
interface IFormatPresaTedesca
{
public function inserisciSpinaTedesca();
public function inviaCorrente();
}
 
interface IFormatPresaItaliana
{
public function inserisciSpinaItaliana();
public function inviaCorrente();
}
 
// Adaptee
class LavatriceTedesca implements IFormatPresaTedesca
{
private $spinaInserita = FALSE;
private $correntePresente = FALSE;
public function inserisciSpinaTedesca()
{
$this->spinaInserita = TRUE;
echo "Spina Tedesca inserita\n";
}
public function inviaCorrente()
{
if($this->spinaInserita)
{
$this->correntePresente = TRUE;
echo "Corrente lavatrice Tedesca presente\n";
}
else
{
echo "Corrente lavatrice Tedesca non presente\n";
}
}
public function lava()
{
if($this->correntePresente)
{
echo "Lavaggio iniziato\n";
echo "Lavaggio 25%\n";
echo "Lavaggio 50%\n";
echo "Lavaggio 75%\n";
echo "Lavaggio terminato\n";
}
else
{
echo "Controllare presa\n";
}
}
}
 
// Adapter
class AdattatorePresaTedesca implements IFormatPresaItaliana
{
private $presa;
 
public function __construct(IFormatPresaTedesca $presa)
{
$this->presa = $presa;
}
 
public function inserisciSpinaItaliana()
{
echo "Adattatore presa Tedesca inserito\n";
$this->presa->inserisciSpinaTedesca();
}
 
public function inviaCorrente()
{
$this->presa->inviaCorrente();
}
public function lava()
{
$this->presa->lava();
}
}
 
class LavatriceItaliana implements IFormatPresaItaliana
{
private $correntePresente = FALSE;
private $spinaInserita = FALSE;
public function inserisciSpinaItaliana()
{
$this->spinaInserita = TRUE;
echo "Spina Italiana inserita\n";
}
public function inviaCorrente()
{
if($this->spinaInserita)
{
$this->correntePresente = TRUE;
echo "Corrente lavatrice Italiana presente\n";
}
else
{
echo "Corrente lavatrice Italiana non presente\n";
}
}
public function lava()
{
if($this->correntePresente)
{
echo "Lavaggio iniziato\n";
echo "Lavaggio 25%\n";
echo "Lavaggio 50%\n";
echo "Lavaggio 75%\n";
echo "Lavaggio terminato\n";
}
else
{
echo "Controllare presa\n";
}
}
}
 
// Client
class EseguiLavaggio
{
private $lavatrice;
private $lavatriceConAdattatore;
 
public function __construct()
{
echo "---Lavaggio con Lavatrice Tedesca iniziato---\n";
$this->lavatrice = new LavatriceTedesca();
$this->lavatriceConAdattatore = new AdattatorePresaTedesca($this->lavatrice);
$this->lavatriceConAdattatore->inserisciSpinaItaliana();
$this->lavatriceConAdattatore->inviaCorrente();
$this->lavatriceConAdattatore->lava();
echo "---Vestiti pronti---\n\n";
}
}
 
$lavaggio = new EseguiLavaggio();
 
//Risultato: #quanton81
 
//---Lavaggio con Lavatrice Tedesca iniziato---
//Adattatore presa Tedesca inserito
//Spina Tedesca inserita
//Corrente lavatrice Tedesca presente
//Lavaggio iniziato
//Lavaggio 25%
//Lavaggio 50%
//Lavaggio 75%
//Lavaggio terminato
//---Vestiti pronti---
</syntaxhighlight>
 
== Voci correlate ==
* [[Design pattern]]
* [[Bridge pattern|Bridge]]
* [[Decorator]]
* [[Proxy pattern|Proxy]]
 
== Altri progetti ==
{{interprogetto|commons=Adapter (design pattern)}}
 
{{Design Patterns Patterns}}
 
{{Design pattern}}
[[Categoria:Pattern]]
 
[[Categoria:Design pattern]]
[[bg:Адаптер (шаблон)]]
[[cs:Adaptér (návrhový vzor)]]
[[de:Adapter (Entwurfsmuster)]]
[[en:Adapter pattern]]
[[es:Adapter (patrón de diseño)]]
[[fr:Adaptateur (patron de conception)]]
[[ja:Adapter パターン]]
[[ko:어댑터 패턴]]
[[nl:Adapter (informatica)]]
[[pl:Adapter (wzorzec projektowy)]]
[[pt:Adapter]]
[[ru:Адаптер (шаблон проектирования)]]
[[th:อะแด็ปเตอร์แพตเทิร์น]]
[[uk:Адаптер (шаблон проектування)]]
[[vi:Adapter pattern]]
[[zh:适配器模式]]