The generic agent pattern is a common pattern that can be reused with multiple interfaces while the functionality; like driving and monitoring of the interface, can be implemented using callbacks.
This approach ensures a clean inheritance hierarchy in the testbench components. It also provides faster testbench development time for configurable designs that can support multiple interface protocols.