When writing testable code, it is often necessary to decouple implementation from abstractions. For example, when writing a network-based or database-driven application, you may not have access to a database during testing, and you'll probably want to test without the possibility of networking failure.
Using the bridge pattern can help you achieve your goals in terms of architecture and testability. By decoupling interfaces from implementations, the bridge pattern lets you swap at runtime which object performs the work, while retaining the same abstractions.
The bridge pattern is oriented around two interfaces:
Abstraction
Implementor
Instead of implementing the Abstraction
interface directly, the bridge pattern encourages the introduction of the Implementor
interface, which in turn will be the top-level interface for feature implementation.
Let's consider the following code. It shows a class that performs some work:
class Abstraction { func start...