Le patron de délégation est une technique fondamentale dans les patrons de conception logicielle. Dans le patron de délégation, deux objets participent au traitement de la même requête, et l'objet qui reçoit la requête délègue celle-ci à un autre objet pour qu'il la traite. Le patron de délégation est une technique fondamentale ; de nombreux autres patrons, tels que le patron d'état, le patron de stratégie et le patron de visiteur, emploient essentiellement le patron de délégation dans des situations plus spécifiques. Le patron de délégation nous permet d'utiliser l'agrégation au lieu de l'héritage, et il nous permet également de simuler des mixins.
Exemple Java simple
Dans cet exemple, la classe simulant une imprimante, Printer, contient une instance de l'imprimante à aiguilles RealPrinter, et la méthode print() de Printer délègue le traitement à la méthode print() de RealPrinter.
class RealPrinter { // the "delegate"
void print() {
System.out.print("something");
}
}
class Printer { // the "delegator"
RealPrinter p = new RealPrinter(); // create the delegate
void print() {
p.print(); // delegation
}
}
public class Main {
// to the outside world it looks like Printer actually prints.
public static void main(String[] args) {
Printer printer = new Printer();
printer.print();
}
}
Exemple Java complexe
En utilisant des interfaces, la délégation peut garantir la sûreté du typage et être plus flexible. Dans cet exemple, la classe C peut déléguer à la classe A ou à la classe B, et la classe C possède des méthodes qui lui permettent de choisir entre la classe A ou la classe B. Comme la classe A ou la classe B doit implémenter les méthodes définies par l'interface I, la délégation ici est sûre du point de vue du typage. Cet exemple montre que l'inconvénient de la délégation est qu'elle nécessite davantage de code.
interface I {
void f();
void g();
}
class A implements I {
public void f() { System.out.println("A: doing f()"); }
public void g() { System.out.println("A: doing g()"); }
}
class B implements I {
public void f() { System.out.println("B: doing f()"); }
public void g() { System.out.println("B: doing g()"); }
}
class C implements I {
// delegation
I i = new A();
public void f() { i.f(); }
public void g() { i.g(); }
// normal attributes
public void toA() { i = new A(); }
public void toB() { i = new B(); }
}
public class Main {
public static void main(String[] args) {
C c = new C();
c.f(); // output: A: doing f()
c.g(); // output: A: doing g()
c.toB();
c.f(); // output: B: doing f()
c.g(); // output: B: doing g()
}
}
Source : https://zh.wikipedia.org/wiki/%E5%A7%94%E6%89%98%E6%A8%A1%E5%BC%8F