Skip to content

Commit d985b64

Browse files
authored
Implement iterator design pattern with corresponding test case (#60)
1 parent d51a509 commit d985b64

File tree

3 files changed

+91
-0
lines changed

3 files changed

+91
-0
lines changed

DesignPatterns/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ with practical examples and best practices for using design patterns to create r
1313
- [Command](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/command) 📝
1414
- [Execute Around Method (EAM)](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/eam)
1515
- [Interpreter](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/interpreter) 📰
16+
- [Iterator](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/iterator) 🔄
1617
- [Mediator](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/mediator) 🗣️
1718
- [Memento](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/memento) 💾
1819
- [Observer](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/observer) 👀
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package pl.mperor.lab.java.design.pattern.behavioral.iterator;
2+
3+
import java.util.Arrays;
4+
import java.util.Iterator;
5+
import java.util.List;
6+
7+
class Worm implements Iterable<Worm.Segment> {
8+
9+
private final List<Segment> segments;
10+
11+
Worm(WormColor... colors) {
12+
this.segments = Arrays.stream(colors).map(Segment::new).toList();
13+
}
14+
15+
@Override
16+
public Iterator<Segment> iterator() {
17+
return segments.iterator();
18+
}
19+
20+
record Segment(WormColor color) {
21+
}
22+
23+
enum WormColor {
24+
BLUE,
25+
WHITE,
26+
RED,
27+
GREEN,
28+
PURPLE,
29+
GRAY,
30+
BLACK
31+
}
32+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package pl.mperor.lab.java.design.pattern.behavioral.iterator;
2+
3+
import org.junit.jupiter.api.Assertions;
4+
import org.junit.jupiter.api.Test;
5+
6+
import java.util.EnumMap;
7+
import java.util.List;
8+
import java.util.Map;
9+
import java.util.function.Function;
10+
import java.util.stream.Collectors;
11+
12+
import static pl.mperor.lab.java.design.pattern.behavioral.iterator.Worm.WormColor;
13+
14+
public class WormSegmentIteratorTest {
15+
16+
@Test
17+
public void testWormHasIterableSegments() {
18+
var scientist = new Scientist();
19+
var worms = scientist.getWorms();
20+
var popularityByWormColor = worms.stream()
21+
.map(scientist::findDominantColorOfWorm)
22+
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
23+
24+
var dominantColorInWorms = popularityByWormColor.entrySet().stream()
25+
.max(Map.Entry.comparingByValue())
26+
.map(Map.Entry::getKey)
27+
.orElseThrow();
28+
29+
Assertions.assertEquals(WormColor.GREEN, dominantColorInWorms);
30+
}
31+
32+
private record Scientist() {
33+
34+
private List<Worm> getWorms() {
35+
return List.of(
36+
new Worm(WormColor.RED, WormColor.RED, WormColor.GREEN, WormColor.GREEN, WormColor.RED, WormColor.GREEN, WormColor.BLACK, WormColor.BLACK, WormColor.GREEN, WormColor.WHITE, WormColor.RED, WormColor.WHITE, WormColor.BLUE, WormColor.WHITE, WormColor.WHITE, WormColor.BLACK, WormColor.RED, WormColor.BLACK, WormColor.GREEN, WormColor.GREEN, WormColor.WHITE, WormColor.GREEN, WormColor.BLACK, WormColor.WHITE),
37+
new Worm(WormColor.GREEN, WormColor.RED, WormColor.GREEN, WormColor.GREEN, WormColor.WHITE, WormColor.BLACK, WormColor.GREEN, WormColor.GREEN, WormColor.BLUE, WormColor.WHITE, WormColor.BLACK, WormColor.WHITE, WormColor.GREEN, WormColor.WHITE, WormColor.GREEN, WormColor.BLUE, WormColor.BLUE, WormColor.RED, WormColor.WHITE, WormColor.BLACK),
38+
new Worm(WormColor.RED, WormColor.BLUE, WormColor.GREEN, WormColor.WHITE, WormColor.GREEN, WormColor.BLUE, WormColor.WHITE, WormColor.BLACK, WormColor.RED, WormColor.WHITE, WormColor.GREEN, WormColor.RED, WormColor.RED, WormColor.BLUE, WormColor.GREEN, WormColor.BLUE),
39+
new Worm(WormColor.GREEN, WormColor.RED, WormColor.GREEN, WormColor.BLACK, WormColor.RED, WormColor.BLACK, WormColor.BLACK, WormColor.GREEN, WormColor.RED, WormColor.WHITE, WormColor.WHITE, WormColor.GREEN, WormColor.BLUE, WormColor.RED, WormColor.RED, WormColor.WHITE, WormColor.GREEN, WormColor.BLUE, WormColor.BLUE),
40+
new Worm(WormColor.BLACK, WormColor.BLACK, WormColor.GREEN, WormColor.BLUE, WormColor.BLUE, WormColor.BLACK, WormColor.GREEN, WormColor.GREEN, WormColor.RED, WormColor.GREEN, WormColor.BLUE, WormColor.BLUE, WormColor.BLUE, WormColor.BLUE, WormColor.RED, WormColor.GREEN, WormColor.BLUE, WormColor.BLUE, WormColor.BLACK, WormColor.WHITE, WormColor.BLUE),
41+
new Worm(WormColor.RED, WormColor.RED, WormColor.GREEN, WormColor.GREEN, WormColor.RED, WormColor.RED, WormColor.RED, WormColor.GREEN, WormColor.BLACK, WormColor.RED, WormColor.WHITE, WormColor.GREEN, WormColor.BLUE, WormColor.GREEN, WormColor.BLUE, WormColor.RED, WormColor.BLACK, WormColor.RED),
42+
new Worm(WormColor.BLACK, WormColor.BLUE, WormColor.BLUE, WormColor.WHITE, WormColor.RED, WormColor.GREEN, WormColor.RED, WormColor.RED, WormColor.WHITE, WormColor.RED, WormColor.BLACK, WormColor.BLACK, WormColor.WHITE, WormColor.BLACK, WormColor.RED, WormColor.BLACK, WormColor.WHITE, WormColor.BLACK, WormColor.GREEN),
43+
new Worm(WormColor.RED, WormColor.BLUE, WormColor.WHITE, WormColor.GREEN, WormColor.RED, WormColor.GREEN, WormColor.GREEN, WormColor.BLACK, WormColor.WHITE, WormColor.BLACK, WormColor.RED, WormColor.BLUE, WormColor.GREEN, WormColor.BLACK, WormColor.GREEN)
44+
);
45+
}
46+
47+
private WormColor findDominantColorOfWorm(Worm worm) {
48+
Map<WormColor, Integer> popularityByWormColor = new EnumMap<>(WormColor.class);
49+
for (Worm.Segment segment : worm) {
50+
popularityByWormColor.merge(segment.color(), 1, Integer::sum);
51+
}
52+
return popularityByWormColor.entrySet().stream()
53+
.max(Map.Entry.comparingByValue())
54+
.map(Map.Entry::getKey)
55+
.orElseThrow();
56+
}
57+
}
58+
}

0 commit comments

Comments
 (0)