diff --git a/DesignPatterns/README.md b/DesignPatterns/README.md index 2f7ce65..e57e99f 100644 --- a/DesignPatterns/README.md +++ b/DesignPatterns/README.md @@ -15,6 +15,7 @@ with practical examples and best practices for using design patterns to create r - [State](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/state) 📜 - [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) 📋 +- [Visitor](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/visitor) 🧳 ### Creational Design Patterns 🏭 diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/visitor/CorporateCustomer.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/visitor/CorporateCustomer.java new file mode 100644 index 0000000..19fe58e --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/visitor/CorporateCustomer.java @@ -0,0 +1,4 @@ +package pl.mperor.lab.java.design.pattern.behavioral.visitor; + +record CorporateCustomer() implements Customer { +} diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/visitor/Customer.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/visitor/Customer.java new file mode 100644 index 0000000..9af89f3 --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/visitor/Customer.java @@ -0,0 +1,8 @@ +package pl.mperor.lab.java.design.pattern.behavioral.visitor; + +public sealed interface Customer permits CorporateCustomer, RegularCustomer, PremiumCustomer { + + default T accept(CustomerVisitor visitor) { + return visitor.visit(this); + } +} diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/visitor/CustomerVisitor.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/visitor/CustomerVisitor.java new file mode 100644 index 0000000..7e2844f --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/visitor/CustomerVisitor.java @@ -0,0 +1,6 @@ +package pl.mperor.lab.java.design.pattern.behavioral.visitor; + +public interface CustomerVisitor { + + T visit(Customer customer); +} diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/visitor/DiscountLevel.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/visitor/DiscountLevel.java new file mode 100644 index 0000000..27bdd1d --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/visitor/DiscountLevel.java @@ -0,0 +1,13 @@ +package pl.mperor.lab.java.design.pattern.behavioral.visitor; + +enum DiscountLevel { + BRONZE(10), + SILVER(20), + GOLD(30); + + private final int percent; + + DiscountLevel(int percent) { + this.percent = percent; + } +} diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/visitor/DiscountProvider.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/visitor/DiscountProvider.java new file mode 100644 index 0000000..b3d8546 --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/visitor/DiscountProvider.java @@ -0,0 +1,17 @@ +package pl.mperor.lab.java.design.pattern.behavioral.visitor; + +public class DiscountProvider implements CustomerVisitor { + + public DiscountLevel get(Customer customer) { + return customer.accept(this); + } + + @Override + public DiscountLevel visit(Customer customer) { + return switch (customer) { + case RegularCustomer _ -> DiscountLevel.BRONZE; + case CorporateCustomer _ -> DiscountLevel.SILVER; + case PremiumCustomer _ -> DiscountLevel.GOLD; + }; + } +} diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/visitor/InvitationLetterGenerator.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/visitor/InvitationLetterGenerator.java new file mode 100644 index 0000000..1e15749 --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/visitor/InvitationLetterGenerator.java @@ -0,0 +1,18 @@ +package pl.mperor.lab.java.design.pattern.behavioral.visitor; + +public class InvitationLetterGenerator implements CustomerVisitor { + + public Letter generate(Customer customer) { + return customer.accept(this); + } + + @Override + public Letter visit(Customer customer) { + var message = switch (customer) { + case RegularCustomer _ -> "👨 Welcome normal customer!"; + case CorporateCustomer _ -> "‍💼 Welcome business customer!"; + case PremiumCustomer _ -> "🧑‍💼 Welcome vip customer!"; + }; + return new Letter(message); + } +} diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/visitor/Letter.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/visitor/Letter.java new file mode 100644 index 0000000..f334633 --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/visitor/Letter.java @@ -0,0 +1,4 @@ +package pl.mperor.lab.java.design.pattern.behavioral.visitor; + +record Letter(String content) { +} diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/visitor/PremiumCustomer.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/visitor/PremiumCustomer.java new file mode 100644 index 0000000..082024d --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/visitor/PremiumCustomer.java @@ -0,0 +1,4 @@ +package pl.mperor.lab.java.design.pattern.behavioral.visitor; + +record PremiumCustomer() implements Customer { +} diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/visitor/RegularCustomer.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/visitor/RegularCustomer.java new file mode 100644 index 0000000..c1e00c7 --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/behavioral/visitor/RegularCustomer.java @@ -0,0 +1,4 @@ +package pl.mperor.lab.java.design.pattern.behavioral.visitor; + +record RegularCustomer() implements Customer { +} diff --git a/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/behavioral/visitor/CustomerVisitorTest.java b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/behavioral/visitor/CustomerVisitorTest.java new file mode 100644 index 0000000..782fb4e --- /dev/null +++ b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/behavioral/visitor/CustomerVisitorTest.java @@ -0,0 +1,23 @@ +package pl.mperor.lab.java.design.pattern.behavioral.visitor; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class CustomerVisitorTest { + + @Test + public void testGenerateInvitationLetterForDifferentTypeCustomer() { + var generator = new InvitationLetterGenerator(); + Assertions.assertEquals("👨 Welcome normal customer!", generator.generate(new RegularCustomer()).content()); + Assertions.assertEquals("‍💼 Welcome business customer!", generator.generate(new CorporateCustomer()).content()); + Assertions.assertEquals("🧑‍💼 Welcome vip customer!", generator.generate(new PremiumCustomer()).content()); + } + + @Test + public void testDiscountLevelForDifferentTypeCustomer() { + var provider = new DiscountProvider(); + Assertions.assertEquals(DiscountLevel.BRONZE, provider.get(new RegularCustomer())); + Assertions.assertEquals(DiscountLevel.SILVER, provider.get(new CorporateCustomer())); + Assertions.assertEquals(DiscountLevel.GOLD, provider.get(new PremiumCustomer())); + } +} \ No newline at end of file