The bridge pattern

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.