What you have is a set of well-defined components: Each provides a single service to communicate with the other components using simple messages when something needs to be done. If you consider a kitchen, you see it is also composed of several, smaller components, including the oven, refrigerator, and microwave. Top-level objects are composed of smaller components that do the actual work. This perspective is a very natural way of looking at our world, and one with which we are all familiar. We do the same thing in object-oriented programming:
o Identify components that perform a distinct service
o Encapsulate all the items in the component necessary to get the job done
o Identify the messages that need to be provided to the other components