From 4ec73c1676679a02bf2e593bae9441d3d84ea96f Mon Sep 17 00:00:00 2001 From: mperor Date: Mon, 10 Feb 2025 00:22:27 +0100 Subject: [PATCH] Implement iterator design pattern with corresponding test case --- DesignPatterns/README.md | 1 + .../pattern/behavioral/iterator/Worm.java | 32 ++++++++++ .../iterator/WormSegmentIteratorTest.java | 58 +++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/iterator/Worm.java create mode 100644 DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/behavioral/iterator/WormSegmentIteratorTest.java diff --git a/DesignPatterns/README.md b/DesignPatterns/README.md index fd6d32e..04af9d5 100644 --- a/DesignPatterns/README.md +++ b/DesignPatterns/README.md @@ -13,6 +13,7 @@ with practical examples and best practices for using design patterns to create r - [Command](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/command) 📝 - [Execute Around Method (EAM)](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/eam) ⭕ - [Interpreter](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/interpreter) 📰 +- [Iterator](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/iterator) 🔄 - [Mediator](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/mediator) 🗣️ - [Memento](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/memento) 💾 - [Observer](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/observer) 👀 diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/iterator/Worm.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/iterator/Worm.java new file mode 100644 index 0000000..667b6fb --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/iterator/Worm.java @@ -0,0 +1,32 @@ +package pl.mperor.lab.java.design.pattern.behavioral.iterator; + +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; + +class Worm implements Iterable { + + private final List segments; + + Worm(WormColor... colors) { + this.segments = Arrays.stream(colors).map(Segment::new).toList(); + } + + @Override + public Iterator iterator() { + return segments.iterator(); + } + + record Segment(WormColor color) { + } + + enum WormColor { + BLUE, + WHITE, + RED, + GREEN, + PURPLE, + GRAY, + BLACK + } +} diff --git a/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/behavioral/iterator/WormSegmentIteratorTest.java b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/behavioral/iterator/WormSegmentIteratorTest.java new file mode 100644 index 0000000..864ec9c --- /dev/null +++ b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/behavioral/iterator/WormSegmentIteratorTest.java @@ -0,0 +1,58 @@ +package pl.mperor.lab.java.design.pattern.behavioral.iterator; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.EnumMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static pl.mperor.lab.java.design.pattern.behavioral.iterator.Worm.WormColor; + +public class WormSegmentIteratorTest { + + @Test + public void testWormHasIterableSegments() { + var scientist = new Scientist(); + var worms = scientist.getWorms(); + var popularityByWormColor = worms.stream() + .map(scientist::findDominantColorOfWorm) + .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); + + var dominantColorInWorms = popularityByWormColor.entrySet().stream() + .max(Map.Entry.comparingByValue()) + .map(Map.Entry::getKey) + .orElseThrow(); + + Assertions.assertEquals(WormColor.GREEN, dominantColorInWorms); + } + + private record Scientist() { + + private List getWorms() { + return List.of( + 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), + 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), + 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), + 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), + 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), + 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), + 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), + 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) + ); + } + + private WormColor findDominantColorOfWorm(Worm worm) { + Map popularityByWormColor = new EnumMap<>(WormColor.class); + for (Worm.Segment segment : worm) { + popularityByWormColor.merge(segment.color(), 1, Integer::sum); + } + return popularityByWormColor.entrySet().stream() + .max(Map.Entry.comparingByValue()) + .map(Map.Entry::getKey) + .orElseThrow(); + } + } +} \ No newline at end of file