Bridge

The bridge pattern is used to separate the abstract elements of a class from the implementation details, providing the means to replace the implementation details without modifying the abstraction.

Example:

Protocols:

protocol Device {
    func run()
}

protocol Switch {
    var device: Device { get set }
    func turnOn()
}

Implementation:

final class SwitchControl: Switch {
    var device: Device

    func turnOn() {
        self.device.run()
    }

    init(device: Device) {
        self.device = device
    }
}

final class Light: Device {
    func run() {
        print("Light turned ON! 💡")
    }
}

final class Toster: Device {
    func run() {
        print("Toster turned ON! 🍞")
    }
}

Usage:

let lightControl = SwitchControl(device: Light())
lightControl.turnOn()

let tosterControl = SwitchControl(device: Toster())
tosterControl.turnOn()