diff --git a/DesignPatterns/README.md b/DesignPatterns/README.md index 978ee05..46fd074 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) ⭕ +- [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) 📜 - [Strategy](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/strategy) 🎯 diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/memento/History.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/memento/History.java new file mode 100644 index 0000000..8bcc9c2 --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/memento/History.java @@ -0,0 +1,19 @@ +package pl.mperor.lab.java.design.pattern.behavioral.memento; + +import java.util.ArrayDeque; +import java.util.Deque; + +class History { + + private final Deque history = new ArrayDeque<>(); + + void save(TextEditor editor) { + history.push(editor.save()); + } + + void undo(TextEditor editor) { + if (!history.isEmpty()) { + editor.restore(history.pop()); + } + } +} diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/memento/TextEditor.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/memento/TextEditor.java new file mode 100644 index 0000000..9422586 --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/memento/TextEditor.java @@ -0,0 +1,23 @@ +package pl.mperor.lab.java.design.pattern.behavioral.memento; + +class TextEditor { + + private StringBuilder content = new StringBuilder(); + + TextEditor write(String text) { + content.append(text); + return this; + } + + TextMemento save() { + return new TextMemento(content.toString()); + } + + void restore(TextMemento memento) { + content = new StringBuilder(memento.content()); + } + + String getContent() { + return content.toString(); + } +} diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/memento/TextMemento.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/memento/TextMemento.java new file mode 100644 index 0000000..857b238 --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/memento/TextMemento.java @@ -0,0 +1,4 @@ +package pl.mperor.lab.java.design.pattern.behavioral.memento; + +record TextMemento(String content) { +} \ No newline at end of file diff --git a/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/behavioral/memento/TextEditorMementoTest.java b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/behavioral/memento/TextEditorMementoTest.java new file mode 100644 index 0000000..5cbb249 --- /dev/null +++ b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/behavioral/memento/TextEditorMementoTest.java @@ -0,0 +1,23 @@ +package pl.mperor.lab.java.design.pattern.behavioral.memento; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class TextEditorMementoTest { + + @Test + public void testSavingAndRestoringWithTextMemento() { + var editor = new TextEditor(); + var history = new History(); + + editor.write("⭐"); + Assertions.assertEquals("⭐", editor.getContent()); + history.save(editor); + + editor.write("1️⃣").write("2️⃣").write("3️⃣"); + Assertions.assertEquals("⭐1️⃣2️⃣3️⃣", editor.getContent()); + + history.undo(editor); + Assertions.assertEquals("⭐", editor.getContent()); + } +} \ No newline at end of file