As we walk through our imagined system, we will assign behavior to different agents. To begin with these agents will be very abstract, so we use a general name. A software component is simply an abstract design entity with which we can associate responsibilities for different tasks.
Eventually, a component may turn out to be mapped into a class, or a function, a module, or something entirely different. Regardless of its final implementation form, a component should have certain properties.