At each stage in software production, responsibilities should be stated as generally as possible. This opens up the possibility of fusing together classes with common responsibilities and delays the binding of details until appropriate. Responsibilities may be shared among related objects. This is particularly true when considering support for use-cases involving multiple objects. Collaborators Collaborators are classes that assist a class in the fulfilling its responsibilities.
Collaborators always engage in some form of contract.
The collaborations are identified and roles assigned to the classes during analysis. More detailed contracts are specified during design. If a class is incapable of fulfilling a responsibility by itself, it must collaborate with other objects. These relations can generally be drawn from the requirements or from domain analysis. A good way of recording Responsibilities and Collaborators is with CRC cards.