Pont (patron de conception)

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher
Ce modèle est-il pertinent ? Cliquez pour en voir d'autres.
Cet article ou cette section peut contenir un travail inédit ou des déclarations non vérifiées (indiquez la date de pose grâce au paramètre date).

Vous pouvez aider en ajoutant des références. Voir la page de discussion pour plus de détails.

Ce modèle est-il pertinent ? Cliquez pour en voir d'autres.
Cet article ne cite pas suffisamment ses sources (octobre 2014).

Si vous disposez d'ouvrages ou d'articles de référence ou si vous connaissez des sites web de qualité traitant du thème abordé ici, merci de compléter l'article en donnant les références utiles à sa vérifiabilité et en les liant à la section « Notes et références » (modifier l'article, comment ajouter mes sources ?).

Page d'aide sur l'homonymie Pour les articles homonymes, voir Pont (homonymie).

Le pont est un patron de conception de la famille structuration, qui permet de découpler l'interface d'une classe et son implémentation.

La partie concrète (implémentation réelle) peut alors varier, indépendamment de celle abstraite (définition virtuelle), tant qu'elle respecte le contrat de réécriture associé qui les lie (obligation de se conformer aux signatures des fonctions/méthodes, et de leurs fournir un corps physique d'implémentation).

Remarque[modifier | modifier le code]

Ce modèle de structuration de la logique s'illustre notamment dans de nombreuses technologies d'accès éloigné, de communication distante, et d'envoi de message. Il a trait aux techniques de dialogue, d'un point de vue bas niveau - on trouve par exemple: les procédures d'appels distants (RPC), ou les invocations de méthodes distantes (Java RMI) ; et concerne aussi globalement, à un plus haut niveau, les architectures distribuées tels que les ORB ou autres SOA.

Attention[modifier | modifier le code]

Ne pas confondre ce patron avec l'adaptateur, qui est utilisé pour adapter l'interface d'un type vers un autre type, et donc faire en sorte qu'une ou plusieurs classes intègrent un type issu d'une interface en particulier (étendant ainsi son périmètre de transtypage).

Le pont est lui utilisé pour séparer la définition de l'interface (appelée aussi stub, pour « souche » ou « talon ») de l'implémentation (appelée aussi skeleton, symbolisant le « squelette » du sens logique mis en œuvre). Vous pouvez donc, de la sorte, faire évoluer l'implémentation concrète d'une classe sans devoir modifier l'appel effectué par la partie cliente, qui se réfère alors aux signatures de fonctions/méthodes de cette interface (elle-même invariante).

Exemple en Eiffel[modifier | modifier le code]

Exemple écrit en Eiffel.

deferred class 
   ABSTRACTION

feature
   implementator: IMPLEMENTATOR

   make (a_representation: like implementator)
      do
         implementator := a_representation
      end

   do_something
      deferred
      end
end


class 
   REFINED_ABSTRACTION

inherit
   ABSTRACTION

create
   make

feature
   do_something
      do
         -- use `implementator'
      end
end
 
 
deferred class
   IMPLEMENTATOR

feature
   do_something
      deferred
      end
end


class
   IMPLEMENTATION_A

inherit
   IMPLEMENTATOR

feature
   do_something
      do
         print ("Implementation A")
      end
end


class
   IMPLEMENTATION_B

inherit
   IMPLEMENTATOR

feature
   do_something
      do
         print ("Implementation B")
      end
end

Exemple en Java[modifier | modifier le code]

Exemple écrit en Java, et utilisant les bibliothèques Java RMI.

Fichier bridge/Stub.java :

package bridge;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Stub extends Remote 
{
	public void doSomething() throws RemoteException;
}

Fichier bridge/Skeleton.java:

package bridge;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class Skeleton extends UnicastRemoteObject implements Stub 
{
	private static final long serialVersionUID = 42L;

	protected Skeleton() throws RemoteException
	{super();}

	public void doSomething() throws RemoteException
	{System.out.println("Invocation de la méthode doSomething()");}
}