Wyobraź sobie, że masz do dyspozycji kilka różnych algorytmów rozwiązujących ten sam problem. Każdy z tych algorytmów działa lepiej lub gorzej w zależności np. od podanych na wejście danych. Dla przykładu rozważmy dwa warianty prostego algorytmu sprawdzającego, czy dana liczba jest liczbą pierwszą. Celem testu będzie oszacowanie czasu potrzebnego do realizacji tego zadania dla podanej na wejście dużej liczby pierwszej. Implementacja takiego algorytmu umożliwiająca łatwe dodawanie do testu kolejnych implementacji pokazana została na poniższym diagramie UML.
Dwa podstawowe interfejsy ITesting oraz IPrimaryNumberCheck mają za zadanie wymusić obsługę w klasach dziedziczących i umożliwić dostęp do metod zadeklarowanych w tychże interfejsach. Implementacje tychże interfejsów wyglądają w moim przypadku tak:
Jak widać klasa TestingClass dziedziczy po interfejsie ITesting jak również agreguje całą listę tego samego typu interfejsów. Z kolei obsługa operatora += pozwala w łatwy sposób dodawać kolejne interfejsy do testów.
Returned value: true for number 554277413
Time of testing class "23PrimaryNumberCheckForce" is equal: 2930 [ms]
Returned value: true for number 554277413
Time of testing class "27PrimaryNumberCheckOptimized" is equal: 2 [ms]