StructuralPythonverifiedVerified

Bridge Pattern in Python

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

How to Implement the Bridge Pattern in Python

1Step 1: Define the implementation interface

from abc import ABC, abstractmethod


class Renderer(ABC):
    @abstractmethod
    def render_circle(self, radius: float) -> None: ...

    @abstractmethod
    def render_square(self, side: float) -> None: ...

2Step 2: Create concrete implementations

class VectorRenderer(Renderer):
    def render_circle(self, r: float) -> None:
        print(f"Drawing circle (r={r}) as vector")

    def render_square(self, s: float) -> None:
        print(f"Drawing square (s={s}) as vector")


class RasterRenderer(Renderer):
    def render_circle(self, r: float) -> None:
        print(f"Drawing circle (r={r}) as pixels")

    def render_square(self, s: float) -> None:
        print(f"Drawing square (s={s}) as pixels")

3Step 3: Define the abstraction hierarchy

class Shape(ABC):
    def __init__(self, renderer: Renderer) -> None:
        self._renderer = renderer

    @abstractmethod
    def draw(self) -> None: ...

    @abstractmethod
    def resize(self, factor: float) -> None: ...


class Circle(Shape):
    def __init__(self, renderer: Renderer, radius: float) -> None:
        super().__init__(renderer)
        self._radius = radius

    def draw(self) -> None:
        self._renderer.render_circle(self._radius)

    def resize(self, factor: float) -> None:
        self._radius *= factor


class Square(Shape):
    def __init__(self, renderer: Renderer, side: float) -> None:
        super().__init__(renderer)
        self._side = side

    def draw(self) -> None:
        self._renderer.render_square(self._side)

    def resize(self, factor: float) -> None:
        self._side *= factor

4Step 4: Mix and match abstractions with implementations

vector = VectorRenderer()
raster = RasterRenderer()

Circle(vector, 5).draw()    # Drawing circle (r=5) as vector
Square(raster, 10).draw()   # Drawing square (s=10) as pixels

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.