As we mentioned in Chapter 6, Code Design - Designing for Stability and Extensibility, layered architecture is also a separation of concerns. In a layered system, an architecture is composed of hierarchical layers by constraining component behavior so that each component cannot see beyond the immediate layer that they are interacting with.