Les méthodologies classiques de conception conduisent souvent à une modélisation rigoureuse du monde réel (c-à-d le système étudié) qui traduit les réalités du moment.
Les modèles de conception permettent d'identifier des concepts moins évidents (ie un processus, un algorithme). Dans une approche traditionnelle, ces objets n'apparaissent en général que lors du remaniement d'une conception pour la rendre plus souple et plus réutilisable.
Les objets ne sont connus qu'à travers leurs interfaces. Deux objets, dotés d'implémentation complètement différentes, peuvent avoir des interfaces identiques. La liaison dynamique permet l'association à l'exécution d'une requête à un objet.
Les modèles de conception d'une part aident à la définition des interfaces; d'autre part précisent également les relations entre interfaces.
L'héritage de classe définit l'implémentation d'un objet à partir de l'implémentation d'un autre objet. C'est un mécanisme de partage de code et de la représentation.
L'héritage d'interface (sous-typage), décrit comment un objet peut être utilisé à la place d'un autre. Il réduit de façon significative l'interdépendance des implémentations d'un sous-systèmes à l'autre.
Principe : Programmer pour une interface, non pour un développement.
Cela conduit d'une part à ne pas déclarer les variables comme instances de classes concrètes, mais comme se conformant à une interface; d'autre part à l'utilisation des modèles créateurs.
Les deux techniques les plus courantes pour la réutilisation sont :
Principe : Préférer la composition d'objets à l'héritage de classes.
Il n'y a pas vraiment de solution, mais des erreurs à éviter :