Най-просто идеята и на двете е, когато извикаме метод на един клас, той от своя страна да извика метод от друг клас, който реално да свърши работата. Разликата е как става това.
class RealPrinter // the "receiver" { public function print(): void { echo "Hello world!\n"; } } class Printer // the "sender" { private RealPrinter $p;public function __construct()
{
$this->p = new RealPrinter(); // create the receiver
}
public function print(): void
{
$this->p->print(); // calls the receiver
}
} // to the outside world it looks like Printer actually prints $printer = new Printer(); $printer->print();
Горният пример, (макар и нарушаващ Inversion of Control), е пример за Delegation, защото, когато искаме от обект на Printer да свърши нещо, той създава друг обект, чиито метод върши исканото действие и тогава го връща сякаш той го е свършил.
Викащият няма как да знае кой реално е свършил работата.
Но по-същественото е, че двата класа реално погледнато нямат никакво отношение по между си, освен, че единият създава обект от другия (или му го инджектват отвън) за да го използва за да му свърши работата.
Printer не е наследник на RealPrinter, нито обратното, те не се знаят един друг.
Ако имахме наследяване, щяхме да имаме Forwarding, защото и без да създаваме специално друг обект, на който да делигираме да свърши работата, вече ще имаме такъв – аналогичният метод от родителският клас, освен разбира се ако не е private.
Затова още се казва, че класът Printer е „wrapper“, a RealPrinter е „wrapee“, тоест eдиният е „опаковката“, другият е „съдържанието“.