From e626b219b853e63d4ca50c93925ca18d83bccd93 Mon Sep 17 00:00:00 2001 From: mperor Date: Wed, 29 Jan 2025 16:58:17 +0100 Subject: [PATCH] Add template design pattern with test case --- DesignPatterns/README.md | 3 +- .../template/method/BackupProcess.java | 26 +++++++++++++++ .../template/method/DatabaseBackup.java | 24 ++++++++++++++ .../template/method/LocalFileBackup.java | 24 ++++++++++++++ .../method/BackupProcessTemplateTest.java | 33 +++++++++++++++++++ 5 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/template/method/BackupProcess.java create mode 100644 DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/template/method/DatabaseBackup.java create mode 100644 DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/template/method/LocalFileBackup.java create mode 100644 DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/behavioral/template/method/BackupProcessTemplateTest.java diff --git a/DesignPatterns/README.md b/DesignPatterns/README.md index fdd95cb..4c03597 100644 --- a/DesignPatterns/README.md +++ b/DesignPatterns/README.md @@ -11,8 +11,9 @@ 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) โญ• -- [Strategy](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/strategy) ๐ŸŽฏ - [Observer](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/observer) ๐Ÿ‘€ +- [Strategy](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/strategy) ๐ŸŽฏ +- [Template Method](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/template/method) ๐Ÿ“‹ ### Creational Design Patterns ๐Ÿญ diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/template/method/BackupProcess.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/template/method/BackupProcess.java new file mode 100644 index 0000000..99cd166 --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/template/method/BackupProcess.java @@ -0,0 +1,26 @@ +package pl.mperor.lab.java.design.pattern.behavioral.template.method; + +public abstract class BackupProcess { + + public final void execute() { + if (!canExecuteBackup()) { + System.out.println("โ›” Backup not possible. Process terminated."); + return; + } + performBackup(); + verifyBackup(); + cleanup(); + } + + protected boolean canExecuteBackup() { + return true; + } + + protected abstract void performBackup(); + + protected abstract void verifyBackup(); + + protected void cleanup() { + System.out.println("๐Ÿงน Deleting old backup files..."); + } +} \ No newline at end of file diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/template/method/DatabaseBackup.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/template/method/DatabaseBackup.java new file mode 100644 index 0000000..9516a2d --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/template/method/DatabaseBackup.java @@ -0,0 +1,24 @@ +package pl.mperor.lab.java.design.pattern.behavioral.template.method; + +public class DatabaseBackup extends BackupProcess { + + DatabaseBackup() { + System.out.println("===== Database Backup ====="); + } + + @Override + protected boolean canExecuteBackup() { + System.out.println("๐Ÿ—„๏ธ Checking database connection..."); + return true; + } + + @Override + protected void performBackup() { + System.out.println("๐Ÿ’พ Dumping database to SQL file..."); + } + + @Override + protected void verifyBackup() { + System.out.println("โœ… Checking database dump integrity..."); + } +} diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/template/method/LocalFileBackup.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/template/method/LocalFileBackup.java new file mode 100644 index 0000000..28ea984 --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/template/method/LocalFileBackup.java @@ -0,0 +1,24 @@ +package pl.mperor.lab.java.design.pattern.behavioral.template.method; + +public class LocalFileBackup extends BackupProcess { + + LocalFileBackup() { + System.out.println("===== File Backup ====="); + } + + @Override + protected boolean canExecuteBackup() { + System.out.println("๐Ÿ” Checking disk space for backup..."); + return true; + } + + @Override + protected void performBackup() { + System.out.println("๐Ÿ“‚ Copying files to backup directory..."); + } + + @Override + protected void verifyBackup() { + System.out.println("๐Ÿ”ข Comparing checksums of original and copied files..."); + } +} diff --git a/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/behavioral/template/method/BackupProcessTemplateTest.java b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/behavioral/template/method/BackupProcessTemplateTest.java new file mode 100644 index 0000000..3ca5ccc --- /dev/null +++ b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/behavioral/template/method/BackupProcessTemplateTest.java @@ -0,0 +1,33 @@ +package pl.mperor.lab.java.design.pattern.behavioral.template.method; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import pl.mperor.lab.common.TestUtils; + +public class BackupProcessTemplateTest { + + @Test + public void shouldAllowToExecuteBackupProcessForDifferentDataSources() { + var out = TestUtils.setTempSystemOut(); + new DatabaseBackup().execute(); + Assertions.assertLinesMatch(""" + ===== Database Backup ===== + ๐Ÿ—„๏ธ Checking database connection... + ๐Ÿ’พ Dumping database to SQL file... + โœ… Checking database dump integrity... + ๐Ÿงน Deleting old backup files... + """.lines(), out.lines().stream()); + + out = TestUtils.setTempSystemOut(); + new LocalFileBackup().execute(); + Assertions.assertLinesMatch(""" + ===== File Backup ===== + ๐Ÿ” Checking disk space for backup... + ๐Ÿ“‚ Copying files to backup directory... + ๐Ÿ”ข Comparing checksums of original and copied files... + ๐Ÿงน Deleting old backup files... + """.lines(), out.lines().stream()); + + TestUtils.resetSystemOut(); + } +} \ No newline at end of file