clients rely on these interfaces, rather than specific implementation, enabling ease of swapping implementation beneath
for example - a NotificationService client receives a NotificationProvider object rather than a more specific implementation like EmailProvider , enabling loose coupling