diff --git a/patterns/behavioral-patterns/pom.xml b/patterns/behavioral-patterns/pom.xml
index 03b138dfc4..435f07aa98 100644
--- a/patterns/behavioral-patterns/pom.xml
+++ b/patterns/behavioral-patterns/pom.xml
@@ -19,10 +19,22 @@
4.12
test
+
+ org.hamcrest
+ hamcrest-core
+ 1.3
+ test
+
+
+ org.assertj
+ assertj-core
+ 3.8.0
+ test
+
UTF-8
1.8
1.8
-
+
\ No newline at end of file
diff --git a/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/command/client/TextFileApplication.java b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/command/client/TextFileApplication.java
new file mode 100644
index 0000000000..30dcf08e89
--- /dev/null
+++ b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/command/client/TextFileApplication.java
@@ -0,0 +1,19 @@
+package com.baeldung.pattern.command.client;
+
+import com.baeldung.pattern.command.command.OpenTextFileOperation;
+import com.baeldung.pattern.command.command.SaveTextFileOperation;
+import com.baeldung.pattern.command.command.TextFileOperation;
+import com.baeldung.pattern.command.invoker.TextFileOperationExecutor;
+import com.baeldung.pattern.command.receiver.TextFile;
+
+public class TextFileApplication {
+
+ public static void main(String[] args) {
+
+ TextFileOperation openTextFileOperation = new OpenTextFileOperation(new TextFile("file1.txt"));
+ TextFileOperation saveTextFileOperation = new SaveTextFileOperation(new TextFile("file2.txt"));
+ TextFileOperationExecutor textFileOperationExecutor = new TextFileOperationExecutor();
+ System.out.println(textFileOperationExecutor.executeOperation(openTextFileOperation));
+ System.out.println(textFileOperationExecutor.executeOperation(saveTextFileOperation));
+ }
+}
diff --git a/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/command/command/OpenTextFileOperation.java b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/command/command/OpenTextFileOperation.java
new file mode 100644
index 0000000000..c90a162b88
--- /dev/null
+++ b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/command/command/OpenTextFileOperation.java
@@ -0,0 +1,17 @@
+package com.baeldung.pattern.command.command;
+
+import com.baeldung.pattern.command.receiver.TextFile;
+
+public class OpenTextFileOperation implements TextFileOperation {
+
+ private final TextFile textFile;
+
+ public OpenTextFileOperation(TextFile textFile) {
+ this.textFile = textFile;
+ }
+
+ @Override
+ public String execute() {
+ return textFile.open();
+ }
+}
diff --git a/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/command/command/SaveTextFileOperation.java b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/command/command/SaveTextFileOperation.java
new file mode 100644
index 0000000000..b908e2c44c
--- /dev/null
+++ b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/command/command/SaveTextFileOperation.java
@@ -0,0 +1,17 @@
+package com.baeldung.pattern.command.command;
+
+import com.baeldung.pattern.command.receiver.TextFile;
+
+public class SaveTextFileOperation implements TextFileOperation {
+
+ private final TextFile textFile;
+
+ public SaveTextFileOperation(TextFile textFile) {
+ this.textFile = textFile;
+ }
+
+ @Override
+ public String execute() {
+ return textFile.save();
+ }
+}
diff --git a/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/command/command/TextFileOperation.java b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/command/command/TextFileOperation.java
new file mode 100644
index 0000000000..506bb23d99
--- /dev/null
+++ b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/command/command/TextFileOperation.java
@@ -0,0 +1,8 @@
+package com.baeldung.pattern.command.command;
+
+@FunctionalInterface
+public interface TextFileOperation {
+
+ String execute();
+
+}
diff --git a/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/command/invoker/TextFileOperationExecutor.java b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/command/invoker/TextFileOperationExecutor.java
new file mode 100644
index 0000000000..bd2213706e
--- /dev/null
+++ b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/command/invoker/TextFileOperationExecutor.java
@@ -0,0 +1,15 @@
+package com.baeldung.pattern.command.invoker;
+
+import com.baeldung.pattern.command.command.TextFileOperation;
+import java.util.ArrayList;
+import java.util.List;
+
+public class TextFileOperationExecutor {
+
+ private final List textFileOperations = new ArrayList<>();
+
+ public String executeOperation(TextFileOperation textFileOperation) {
+ textFileOperations.add(textFileOperation);
+ return textFileOperation.execute();
+ }
+}
diff --git a/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/command/receiver/TextFile.java b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/command/receiver/TextFile.java
new file mode 100644
index 0000000000..c0b2d3c41e
--- /dev/null
+++ b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/command/receiver/TextFile.java
@@ -0,0 +1,34 @@
+package com.baeldung.pattern.command.receiver;
+
+public class TextFile {
+
+ private final String name;
+
+ public TextFile(String name) {
+ this.name = name;
+ }
+
+ public String open() {
+ return "Opening file " + name;
+ }
+
+ public String read() {
+ return "Reading file " + name;
+ }
+
+ public String write() {
+ return "Writing to file " + name;
+ }
+
+ public String save() {
+ return "Saving file " + name;
+ }
+
+ public String copy() {
+ return "Copying file " + name;
+ }
+
+ public String paste() {
+ return "Pasting file " + name;
+ }
+}
diff --git a/patterns/behavioral-patterns/src/test/java/com/baeldung/pattern/command/test/OpenTextFileOperationUnitTest.java b/patterns/behavioral-patterns/src/test/java/com/baeldung/pattern/command/test/OpenTextFileOperationUnitTest.java
new file mode 100644
index 0000000000..1c72bfdd2f
--- /dev/null
+++ b/patterns/behavioral-patterns/src/test/java/com/baeldung/pattern/command/test/OpenTextFileOperationUnitTest.java
@@ -0,0 +1,16 @@
+package com.baeldung.pattern.command.test;
+
+import com.baeldung.pattern.command.command.OpenTextFileOperation;
+import com.baeldung.pattern.command.command.TextFileOperation;
+import com.baeldung.pattern.command.receiver.TextFile;
+import org.junit.Test;
+import static org.assertj.core.api.Assertions.*;
+
+public class OpenTextFileOperationUnitTest {
+
+ @Test
+ public void givenOpenTextFileOperationIntance_whenCalledExecuteMethod_thenOneAssertion() {
+ TextFileOperation openTextFileOperation = new OpenTextFileOperation(new TextFile("file1.txt"));
+ assertThat(openTextFileOperation.execute()).isEqualTo("Opening file file1.txt");
+ }
+}
diff --git a/patterns/behavioral-patterns/src/test/java/com/baeldung/pattern/command/test/SaveTextFileOperationUnitTest.java b/patterns/behavioral-patterns/src/test/java/com/baeldung/pattern/command/test/SaveTextFileOperationUnitTest.java
new file mode 100644
index 0000000000..a7bc1f3025
--- /dev/null
+++ b/patterns/behavioral-patterns/src/test/java/com/baeldung/pattern/command/test/SaveTextFileOperationUnitTest.java
@@ -0,0 +1,16 @@
+package com.baeldung.pattern.command.test;
+
+import com.baeldung.pattern.command.command.SaveTextFileOperation;
+import com.baeldung.pattern.command.command.TextFileOperation;
+import com.baeldung.pattern.command.receiver.TextFile;
+import org.junit.Test;
+import static org.assertj.core.api.Assertions.*;
+
+public class SaveTextFileOperationUnitTest {
+
+ @Test
+ public void givenSaveTextFileOperationIntance_whenCalledExecuteMethod_thenOneAssertion() {
+ TextFileOperation openTextFileOperation = new SaveTextFileOperation(new TextFile("file1.txt"));
+ assertThat(openTextFileOperation.execute()).isEqualTo("Saving file file1.txt");
+ }
+}
diff --git a/patterns/behavioral-patterns/src/test/java/com/baeldung/pattern/command/test/TextFileOperationExecutorUnitTest.java b/patterns/behavioral-patterns/src/test/java/com/baeldung/pattern/command/test/TextFileOperationExecutorUnitTest.java
new file mode 100644
index 0000000000..efafa0d8a2
--- /dev/null
+++ b/patterns/behavioral-patterns/src/test/java/com/baeldung/pattern/command/test/TextFileOperationExecutorUnitTest.java
@@ -0,0 +1,68 @@
+package com.baeldung.pattern.command.test;
+
+import com.baeldung.pattern.command.command.OpenTextFileOperation;
+import com.baeldung.pattern.command.command.SaveTextFileOperation;
+import com.baeldung.pattern.command.command.TextFileOperation;
+import com.baeldung.pattern.command.invoker.TextFileOperationExecutor;
+import com.baeldung.pattern.command.receiver.TextFile;
+import java.util.function.Function;
+import org.junit.Test;
+import static org.assertj.core.api.Assertions.*;
+import org.junit.BeforeClass;
+
+public class TextFileOperationExecutorUnitTest {
+
+ private static TextFileOperationExecutor textFileOperationExecutor;
+
+
+ @BeforeClass
+ public static void setUpTextFileOperationExecutor() {
+ textFileOperationExecutor = new TextFileOperationExecutor();
+ }
+
+ @Test
+ public void givenTextFileOPerationExecutorInstance_whenCalledexecuteOperationWithOpenTextOperation_thenOneAssertion() {
+ TextFileOperation textFileOperation = new OpenTextFileOperation(new TextFile("file1.txt"));
+ assertThat(textFileOperationExecutor.executeOperation(textFileOperation)).isEqualTo("Opening file file1.txt");
+ }
+
+ @Test
+ public void givenTextFileOPerationExecutorInstance_whenCalledexecuteOperationWithSaveTextOperation_thenOneAssertion() {
+ TextFileOperation textFileOperation = new SaveTextFileOperation(new TextFile("file1.txt"));
+ assertThat(textFileOperationExecutor.executeOperation(textFileOperation)).isEqualTo("Saving file file1.txt");
+ }
+
+ @Test
+ public void givenTextFileOperationExecutorInstance_whenCalledexecuteOperationWithTextFileOpenLambda_thenOneAssertion() {
+ assertThat(textFileOperationExecutor.executeOperation(() -> {return "Opening file file1.txt";})).isEqualTo("Opening file file1.txt");
+ }
+
+ @Test
+ public void givenTextFileOperationExecutorInstance_whenCalledexecuteOperationWithTextFileSaveLambda_thenOneAssertion() {
+ assertThat(textFileOperationExecutor.executeOperation(() -> {return "Saving file file1.txt";})).isEqualTo("Saving file file1.txt");
+ }
+
+ @Test
+ public void givenTextFileOperationExecutorInstance_whenCalledexecuteOperationWithTextFileOpenMethodReferenceOfExistingObject_thenOneAssertion() {
+ TextFile textFile = new TextFile("file1.txt");
+ assertThat(textFileOperationExecutor.executeOperation(textFile::open)).isEqualTo("Opening file file1.txt");
+ }
+
+ @Test
+ public void givenTextFileOperationExecutorInstance_whenCalledexecuteOperationWithTextFileSaveMethodReferenceOfExistingObject_thenOneAssertion() {
+ TextFile textFile = new TextFile("file1.txt");
+ assertThat(textFileOperationExecutor.executeOperation(textFile::save)).isEqualTo("Saving file file1.txt");
+ }
+
+ @Test
+ public void givenOpenTextFileOperationExecuteMethodReference_whenCalledApplyMethod_thenOneAssertion() {
+ Function executeMethodReference = OpenTextFileOperation::execute;
+ assertThat(executeMethodReference.apply(new OpenTextFileOperation(new TextFile("file1.txt")))).isEqualTo("Opening file file1.txt");
+ }
+
+ @Test
+ public void givenSaveTextFileOperationExecuteMethodReference_whenCalledApplyMethod_thenOneAssertion() {
+ Function executeMethodReference = SaveTextFileOperation::execute;
+ assertThat(executeMethodReference.apply(new SaveTextFileOperation(new TextFile("file1.txt")))).isEqualTo("Saving file file1.txt");
+ }
+}
diff --git a/patterns/behavioral-patterns/src/test/java/com/baeldung/pattern/command/test/TextFileUnitTest.java b/patterns/behavioral-patterns/src/test/java/com/baeldung/pattern/command/test/TextFileUnitTest.java
new file mode 100644
index 0000000000..32b83897c9
--- /dev/null
+++ b/patterns/behavioral-patterns/src/test/java/com/baeldung/pattern/command/test/TextFileUnitTest.java
@@ -0,0 +1,42 @@
+package com.baeldung.pattern.command.test;
+
+import com.baeldung.pattern.command.receiver.TextFile;
+import org.junit.Test;
+import static org.assertj.core.api.Assertions.*;
+import org.junit.BeforeClass;
+
+public class TextFileUnitTest {
+
+ private static TextFile textFile;
+
+
+ @BeforeClass
+ public static void setUpTextFileInstance() {
+ textFile = new TextFile("file1.txt");
+ }
+
+ @Test
+ public void givenTextFileInstance_whenCalledopenMethod_thenOneAssertion() {
+ assertThat(textFile.open()).isEqualTo("Opening file file1.txt");
+ }
+
+ @Test
+ public void givenTextFileInstance_whenCalledwriteMethod_thenOneAssertion() {
+ assertThat(textFile.write()).isEqualTo("Writing to file file1.txt");
+ }
+
+ @Test
+ public void givenTextFileInstance_whenCalledsaveMethod_thenOneAssertion() {
+ assertThat(textFile.save()).isEqualTo("Saving file file1.txt");
+ }
+
+ @Test
+ public void givenTextFileInstance_whenCalledcopyMethod_thenOneAssertion() {
+ assertThat(textFile.copy()).isEqualTo("Copying file file1.txt");
+ }
+
+ @Test
+ public void givenTextFileInstance_whenCalledpasteMethod_thenOneAssertion() {
+ assertThat(textFile.paste()).isEqualTo("Pasting file file1.txt");
+ }
+}