Sort

Il s'agit d'écrire une application qui permette d'exécuter un tri sur un jeu de données et de visualiser les différentes actions de ce tri sur la sortie standard. On veut pouvoir faire cela de façon la plus générique possible, c'est à dire pouvoir passer facilement d'un algorithme de tri à un autre, ou d'une implémentation de jeu de données à une autre. L'interface Sort décrit un tri comme étant une classe implémentant une méthode doSort(SortableData).
L'interface SortableData décrit une collection triable. Une telle collection doit implémenter quatre méthodes QuickSort et InsertionSort sont deux implémentations de Sort. Ce sont toutes les deux des singletons, puiqu'il n'y a aucune raison de créer deux instances d'un même algorithme de tri.
SortableArray est une implémentation de SortableData, créée à partir d'un tableau. Le tableau passé en paramètre du constructeur sera trié par l'application de Sort.doSort(SortableData) au SortableArray obtenu.
SortableDataTracer et SortableDataStatistic sont deux décorateurs de SortableData qui permettent respectivement l'affichage des actions effectuées par le tri sur la sortie standard, et le calcul de statistiques sur le tri (nombre d'accès, de comparaisons et d'échanges).
Singleton et Décorateur sont deux exemples de schémas de programmation, c'est à dire d'architectures de classes souvent utilisées car résolvant un problème classique. Un singleton est une classe dont une seule instance est nécessaire. Un décorateur est une classe qui sert à rajouter des fonctionnalités à une autre classe.