Éditer sur GitHub

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 :

interface GeoLogger {
    void log(LogLevel level, String message, Geometry g);
}
class ConsoleGeoLogger implements GeoLogger {
    void log(LogLevel level, String message, Geometry g){
        // écriture d'un message dans la console
    }
}
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 :

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