Un wrapper è molto semplicemente una funzione che esiste per chiamare un'altra funzione, con poco o nessun codice aggiuntivo. Il termine è un ombrello per diversi design pattern "Gang of 4", a seconda dell'esatto intento:
* Bridge - Il wrapper esiste semplicemente per "nascondere" un metodo da altro codice. Questo è spesso fatto nell'architettura n-tier per imporre la "separazione delle preoccupazioni"; è ampiamente accettato che la logica che mostra i dati all'utente non dovrebbe preoccuparsi della provenienza dei dati, e allo stesso modo il codice che recupera i dati non dovrebbe preoccuparsi (almeno non troppo) di come vengono visualizzati. Mettendo il "ponte", il consumatore del ponte non deve cambiare se il metodo che stai avvolgendo lo fa (sempre che tu non debba cambiare la firma del metodo che fa da ponte).
* Adapter - Il wrapper cambia la firma del metodo, e/o la sua classe contenente, in modo che possa essere usato dove è prevista un'altra "interfaccia". Questo è un uso molto comune per i wrapper.
* Composito - I wrapper non devono avvolgere solo un altro metodo. Possono apparire esattamente come il metodo che stanno avvolgendo, ma in realtà avvolgono due o tre o quattro metodi con quella firma, "trasmettendo" una singola chiamata di metodo a più posti nel codice.
* Proxy - I wrapper sono comunemente visti nei livelli di servizio. Sembrano esattamente come il metodo nel codice di un'altra macchina, ma quando li chiamate, trasformano la chiamata in un messaggio di rete che viene inviato a quell'altra macchina per effettuare effettivamente la chiamata. Il "wrapper" esiste per rendere il servizio più facile e intuitivo da usare, come se si stesse eseguendo quel codice localmente.