To a certain extent, any architecture, whether it is a low-level or a high-level architecture, is a form of decoupling. An architecture's intention is to detail logical and physical abstractions to a certain level. Abstractions are the most common method of decoupling. Something that depends on an abstraction instead of something that is concrete is said to be loosely coupled since it does not directly depend on certain implementation details.
In any system that requires two components, you can never completely decouple the two. At the very least, the system won't work without both components. Decoupling isn't about removing a component from a system, rather it's about distilling dependencies down to depending on components that are more stable. Ideally, abstractions should be the most stable, so an idea dependency is upon an abstraction.
To a certain extent, an architecture is the decoupling vision of an application or system. Most of the decisions about decoupling should be made...