StructuralC#verifiedVerified

Bridge Pattern in C#

Decouples an abstraction from its implementation so that the two can vary independently.

How to Implement the Bridge Pattern in C#

1Step 1: Implementation interface (the "bridge")

public interface IRenderer
{
    string RenderCircle(double radius);
    string RenderSquare(double side);
}

2Step 2: Concrete implementations

public class SvgRenderer : IRenderer
{
    public string RenderCircle(double radius) =>
        $"<circle r=\"{radius}\"/>";

    public string RenderSquare(double side) =>
        $"<rect width=\"{side}\" height=\"{side}\"/>";
}

public class CanvasRenderer : IRenderer
{
    public string RenderCircle(double radius) =>
        $"ctx.arc(0, 0, {radius})";

    public string RenderSquare(double side) =>
        $"ctx.fillRect(0, 0, {side}, {side})";
}

3Step 3: Abstraction uses the implementation via the bridge

public abstract class Shape(IRenderer renderer)
{
    protected IRenderer Renderer => renderer;
    public abstract string Draw();
}

public class Circle(IRenderer renderer, double radius)
    : Shape(renderer)
{
    public override string Draw() => Renderer.RenderCircle(radius);
}

public class Square(IRenderer renderer, double side)
    : Shape(renderer)
{
    public override string Draw() => Renderer.RenderSquare(side);
}

// Usage:
// var circle = new Circle(new SvgRenderer(), 10);
// Console.WriteLine(circle.Draw()); // <circle r="10"/>

Bridge Pattern Architecture

hourglass_empty

Rendering diagram...

lightbulb

Bridge Pattern in the Real World

A TV remote (abstraction) works with any brand of television (implementation) because both sides communicate through an agreed IR protocol (the bridge). Samsung and LG can redesign their TVs, and universal remote makers can add new button layouts—neither side needs to know about the other’s internal design, only the shared protocol.