During the system design process the system is decomposed into a network of subsystems, each subsystem is decomposed into a network of components, and each component is decomposed into a network of sub-components:
Since subsystems and sub-components are just types of components, then we can view system design as an iterative process in which high-level components are decomposed into lower-level components:
The output of system design can be expressed as one or more component diagrams:
Each component is implemented as a collaboration of objects. The interaction between these objects can be modeled using a sequence diagram:
In a distributed application, components may be deployed on different computers. Although not part of the design process, it's a good idea to get a handle on assumptions about deployment and connectivity between computers. This can be captured in a deployment diagram:
Try some of the examples in:
There are several principles that designers follow that often lead to better designs:
Design Goals and Principles (Modularity and Abstraction)
Unrelated components can have similar designs; also, unrelated applications can have similar designs. Over the years these have been formalized and cataloged by assiduous programmers.
Here are some of the most common architectural patterns: