From d332c75c2e8353c641fb878be5fd36d8621cf036 Mon Sep 17 00:00:00 2001 From: mperor Date: Fri, 7 Feb 2025 11:35:45 +0100 Subject: [PATCH] Add mediator design pattern with test case --- DesignPatterns/README.md | 1 + .../pattern/behavioral/mediator/ChatRoom.java | 20 ++++++++++++ .../pattern/behavioral/mediator/ChatUser.java | 13 ++++++++ .../behavioral/mediator/ChatMediatorTest.java | 31 +++++++++++++++++++ 4 files changed, 65 insertions(+) create mode 100644 DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/mediator/ChatRoom.java create mode 100644 DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/mediator/ChatUser.java create mode 100644 DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/behavioral/mediator/ChatMediatorTest.java diff --git a/DesignPatterns/README.md b/DesignPatterns/README.md index 46fd074..54decea 100644 --- a/DesignPatterns/README.md +++ b/DesignPatterns/README.md @@ -12,6 +12,7 @@ with practical examples and best practices for using design patterns to create r - [Chain of Responsibility](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/chain/of/responsibility) 🔗 - [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) ⭕ +- [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) 👀 - [State](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/state) 📜 diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/mediator/ChatRoom.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/mediator/ChatRoom.java new file mode 100644 index 0000000..121e32f --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/mediator/ChatRoom.java @@ -0,0 +1,20 @@ +package pl.mperor.lab.java.design.pattern.behavioral.mediator; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Predicate; + +class ChatRoom { + + private final List users = new ArrayList<>(); + + void addUser(ChatUser user) { + users.add(user); + } + + void sendMessage(String message, ChatUser sender) { + users.stream() + .filter(Predicate.not(sender::equals)) + .forEach(user -> user.receive(message)); + } +} diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/mediator/ChatUser.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/mediator/ChatUser.java new file mode 100644 index 0000000..24d656b --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/mediator/ChatUser.java @@ -0,0 +1,13 @@ +package pl.mperor.lab.java.design.pattern.behavioral.mediator; + +record ChatUser(ChatRoom mediator, String name) { + + void send(String message) { + System.out.println(name + " sends: " + message); + mediator.sendMessage(message, this); + } + + void receive(String message) { + System.out.println(name + " received: " + message); + } +} \ No newline at end of file diff --git a/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/behavioral/mediator/ChatMediatorTest.java b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/behavioral/mediator/ChatMediatorTest.java new file mode 100644 index 0000000..cf62e77 --- /dev/null +++ b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/behavioral/mediator/ChatMediatorTest.java @@ -0,0 +1,31 @@ +package pl.mperor.lab.java.design.pattern.behavioral.mediator; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import pl.mperor.lab.common.TestUtils; + +public class ChatMediatorTest { + + @Test + public void testChatRoomMediating() { + var out = TestUtils.setTempSystemOut(); + + var chat = new ChatRoom(); + var alice = new ChatUser(chat, "👩 Alice"); + var bob = new ChatUser(chat, "👨 Bob"); + + chat.addUser(alice); + chat.addUser(bob); + + alice.send("Hello everyone!"); + bob.send("Hi Alice!"); + + var outLines = out.lines(); + Assertions.assertEquals("👩 Alice sends: Hello everyone!", outLines.getFirst()); + Assertions.assertEquals("👨 Bob received: Hello everyone!", outLines.getSecond()); + Assertions.assertEquals("👨 Bob sends: Hi Alice!", outLines.getThird()); + Assertions.assertEquals("👩 Alice received: Hi Alice!", outLines.getForth()); + + TestUtils.resetSystemOut(); + } +} \ No newline at end of file