Bridge
Publié le 23 Mai 2025Bridge est un design pattern structurel qui vise à découpler une abstraction de son implémentation de manière à ce qu’elles puissent évoluer indépendamment. C’est un pattern très utile lorsqu’on anticipe que plusieurs instances déclinaisons de classes peuvent exister.
Principe
Exemples d’utilisations
Un système d’authentifications multiples
Générateur de contenu multi format
Points d’attentions
Implémenter un Bridge
Voici un exemple en Go
package logs
import "fmt"
// LogOutput Implémentation (le backend)
type LogOutput interface {
Write(message string)
}
type FileOutput struct{}
func (f *FileOutput) Write(message string) {
fmt.Println("File:", message) // ici on simule
}
type StdoutOutput struct{}
func (s *StdoutOutput) Write(message string) {
fmt.Println("Stdout:", message)
}
// Logger Abstraction
type Logger struct {
output LogOutput
format string
}
func NewLogger(output LogOutput, format string) *Logger {
return &Logger{output: output, format: format}
}
func (l *Logger) Log(message string) {
var formatted string
switch l.format {
case "json":
formatted = fmt.Sprintf(`{"message": "%s"}`, message)
default:
formatted = message
}
l.output.Write(formatted)
}
package main
import "designpatterns/bridge/logs"
func main() {
stdout := &logs.StdoutOutput{}
logger := logs.NewLogger(stdout, "json")
logger.Log("User logged in")
}
Le même exemple en PHP
namespace Practice\DesignPatterns\Bridge;
interface LogOutputInterface {
public function write(string $message): void;
}
namespace Practice\DesignPatterns\Bridge;
class FileOutput implements LogOutputInterface {
public function write(string $message): void {
echo "File: $message\n"; // ici on simule
}
}
namespace Practice\DesignPatterns\Bridge;
class StdoutOutput implements LogOutputInterface {
public function write(string $message): void {
echo "Stdout: $message\n";
}
}
namespace Practice\DesignPatterns\Bridge;
class Logger {
private LogOutputInterface $output;
private string $format;
public function __construct(LogOutputInterface $output, string $format) {
$this->output = $output;
$this->format = $format;
}
public function log(string $message): void {
switch ($this->format) {
case 'json':
$formatted = json_encode(['message' => $message]);
break;
default:
$formatted = $message;
}
$this->output->write($formatted);
}
}
declare(strict_types=1);
require "./vendor/autoload.php";
use Practice\DesignPatterns\Bridge\Logger;
use Practice\DesignPatterns\Bridge\StdoutOutput;
$output = new StdoutOutput();
$logger = new Logger($output, 'json');
$logger->log("User logged in");