a simple interface is required to access a complex system, a system is very complex or difficult to understand, an entry point is needed to each level of layered software, or the abstractions and implementations of a subsystem are tightly coupled.