Aller au contenu

Bridge

Problème

Nous souhaitons découpler une abstraction de son implémentation afin que les deux puissent varier indépendamment l'une de l'autre.

Cas d'école

Nous développons des algorithmes réalisant des parcours de graphes. Pour être en mesure d'analyser les problèmes et de visualiser le comportement de l'algorithme, nous souhaitons soit :

Solution

Nous pouvons nous inspirer du patron bridge :

UML Bridge

Source https://en.wikipedia.org/wiki/Bridge_pattern

Nous aurons par exemple :

  • Une interface GeoLogger
interface GeoLogger {
    void log(LogLevel level, String message, Geometry g);
}
  • Une implémentation pour l'écriture classique :
class ConsoleGeoLogger implements GeoLogger {
    void log(LogLevel level, String message, Geometry g){
        // écriture d'un message dans la console
    }
}
  • Une implémentation pour l'écriture dans une table :
class DatabaseGeoLogger implements GeoLogger {
    void log(LogLevel level, String message, Geometry g){
        // écriture d'une ligne dans une table
    }
}

A l'utilisation, nous dépendrons uniquement de GeoLogger qui pourra être initialisée en fonction de variables fournies à l'exécution :

class MonTraitement {
    private GeoLogger logger;

    public MonTraitement(GeoLogger logger){
        this.logger = logger;
    }

    public void traitement(Geometry geometry){
        this.logger.log(LogLevel.INFO, "calcul d'un buffer...", geometry);
        Geometry buffer = geometry.buffer();
        this.logger.log(LogLevel.INFO, "buffer résultant...", buffer);
        //...
    }
}

Remarques

En pratique, le patron bridge sera souvent utilisé pour :

  • Localiser la dépendance à une bibliothèque (i.e. ne pas en dépendre partout dans son code).
  • Permettre le choix entre plusieurs bibliothèques

Nous trouverons souvent des bridges dans les Framework :

En TypeScript, vous pourriez par exemple être amené à faire un bridge sur Turf.js ou JSTS pour localiser la dépendance aux bibliothèques de calcul géométrique.

Liens utiles