From a naive translation, we obtain lots of concepts with lots of specific collaborations. This is where the real work begins. Going from one phase to another, as we stated before, we observe a semantics shift. Namely, we move from application semantics to operational semantics. Most of the time, this is the place where flexibility and evolutive concerns arise.
Collaborations have to be abstract at the operational level.
Then, patterns can be perceived. Abstraction from detailed application semantics is the key step toward good design and the identification of the proper patterns. In other words, if you step back from the job at hand and factor your components more generally, you're likely to arrive at a better design. Although interesting in their own right, the value of some of the implementations presented in Design Patterns and Contracts is also open to question. When the language changes, the whole interpreter needs to be regenerated.