The Missing Advice
Your best design intentions can be destroyed in a flash if you don’t consider the intricacies of the implementation strategy.
Think about how to map your desired design on to code structures, how to organize that code, and which decoupling modes to apply during runtime and compile-time.
Leave options open where applicable, but be pragmatic, and take into consideration the size of your team, their skill leve, and the complexity of the solution in conjunction with your time and budgetary constraints.
Also think about using your compiler to help you enforce your chosen architectural style, and watch out for coupling in other areas, such as data models.
The devil is in the implementation details.