Skip to main content

Oefening Strategy Pattern

Woordenlijsten sorteren

Je kan een lijst met woorden alfabetisch ordenen door een methode sorteer() te gebruiken. De voorlopige versie van het class diagram ziet er als volgt uit:

Mermaid broncode voor "Woordenlijst"
classDiagram
class Woordenlijst {
-woorden : String[]
+sorteer() void
}

Er zijn diverse algoritmen beschikbaar om te sorteren, bijv. Quicksort, Shellsort, en Mergesort. Het doel is om het sorteeralgoritme, dat wordt gebruikt om de woordenlijst te sorteren, flexibel te kunnen veranderen. Hiervoor is het Strategy Pattern toegepast. Dit wordt getoond in twee diagrammen:

Diagram 1: Samenstelling - Hoe Woordenlijst gebruikmaakt van ISorteerStrategie:

Mermaid broncode voor "Mermaid-diagram"
classDiagram
direction LR

class Woordenlijst {
-woorden : String[]
+sorteer() void
+setSorteerStrategie(strategie : ISorteerStrategie) void
}

class ISorteerStrategie {
<<interface>>
+sorteer(woorden : String[]) void
}

Woordenlijst --> "1" ISorteerStrategie : -huidigeStrategie

note for Woordenlijst "public void sorteer() {<br/> huidigeStrategie.sorteer(woorden);<br/>}"

Diagram 2: Hiërarchie - de verschillende implementaties van ISorteerStrategie:

Mermaid broncode voor "Mermaid-diagram"
classDiagram
direction TB

class ISorteerStrategie {
<<interface>>
+sorteer(woorden : String[]) void
}

class SelectionSort {
+sorteer(woorden : String[]) void
}

class BubbleSort {
+sorteer(woorden : String[]) void
}

ISorteerStrategie <|.. SelectionSort
ISorteerStrategie <|.. BubbleSort

Een deel van de broncode van de applicatie is al gegeven waarbij i.p.v. de in het class diagram genoemde sorteermethoden gekozen is voor de Bubblesort en Selectionsort algoritmen.

public class Woordenlijst {
private String[] woorden = {"hond", "beer", "leeuw", "kat", "aap", "tijger", "olifant"};

public void print() {
for (int i = 0; i < woorden.length; i++) {
System.out.print(woorden[i] + " ");
}
System.out.println();
}

public void sorteer() {
throw new UnsupportedOperationException("Not yet implemented");
}

public void setSorteerStrategie(ISorteerStrategie strategie) {
throw new UnsupportedOperationException("Not yet implemented");
}
}

public class BubbleSort {

@Override
public void sorteer(String[] woorden) {
for (int grens = woorden.length; grens > 0; grens--) {
for (int i = 0; i < grens-1; i++) {
if (woorden[i].compareTo(woorden[i+1]) > 0) {
String hulp = woorden[i];
woorden[i] = woorden[i+1];
woorden[i+1] = hulp;
}
}
}
}
}

public class SelectionSort {

@Override
public void sorteer(String[] woorden) {
for (int startpositie = 0; startpositie < woorden.length; startpositie++) {
int positieMinimum = startpositie;
for (int i = startpositie+1; i < woorden.length; i++) {
if (woorden[positieMinimum].compareTo(woorden[i]) > 0) {
positieMinimum = i;
}
}
String hulp = woorden[startpositie];
woorden[startpositie] = woorden[positieMinimum];
woorden[positieMinimum] = hulp;
}
}
}

De methode sorteer() in de klasse Woordenlijst is nog niet geïmplementeerd. Implementeer deze methode en zorg ervoor dat de klasse Woordenlijst gebruik maakt van de BubbleSort of SelectionSort klasse om de woordenlijst te sorteren. Maak hiervoor ook de ISorteerStrategie interface, pas de BubbleSort en SelectionSort hierop aan en gebruik deze interface in de Woordenlijst. Maak ook een main class die de Woordenlijst klasse gebruikt en de woordenlijst sorteert met een van de beschikbare sorteeralgoritmes.