The Bridge design pattern provides a solution:
Define separate inheritance hierarchies for an abstraction and its implementation.
Abstraction delegates its implementation to an Implementor object
instead of committing to an implementation at compile-time.
Describing the Bridge design in more detail is the theme of the following sections.
See Applicability section for all problems Bridge can solve.