Skip to content

Commit 6879f4d

Browse files
authored
Add visitor design pattern with test scenario (#55)
1 parent 0a3e884 commit 6879f4d

File tree

11 files changed

+102
-0
lines changed

11 files changed

+102
-0
lines changed

DesignPatterns/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ with practical examples and best practices for using design patterns to create r
1515
- [State](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/state) 📜
1616
- [Strategy](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/strategy) 🎯
1717
- [Template Method](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/template/method) 📋
18+
- [Visitor](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/visitor) 🧳
1819

1920
### Creational Design Patterns 🏭
2021

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package pl.mperor.lab.java.design.pattern.behavioral.visitor;
2+
3+
record CorporateCustomer() implements Customer {
4+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package pl.mperor.lab.java.design.pattern.behavioral.visitor;
2+
3+
public sealed interface Customer permits CorporateCustomer, RegularCustomer, PremiumCustomer {
4+
5+
default <T> T accept(CustomerVisitor<T> visitor) {
6+
return visitor.visit(this);
7+
}
8+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package pl.mperor.lab.java.design.pattern.behavioral.visitor;
2+
3+
public interface CustomerVisitor<T> {
4+
5+
T visit(Customer customer);
6+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package pl.mperor.lab.java.design.pattern.behavioral.visitor;
2+
3+
enum DiscountLevel {
4+
BRONZE(10),
5+
SILVER(20),
6+
GOLD(30);
7+
8+
private final int percent;
9+
10+
DiscountLevel(int percent) {
11+
this.percent = percent;
12+
}
13+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package pl.mperor.lab.java.design.pattern.behavioral.visitor;
2+
3+
public class DiscountProvider implements CustomerVisitor<DiscountLevel> {
4+
5+
public DiscountLevel get(Customer customer) {
6+
return customer.accept(this);
7+
}
8+
9+
@Override
10+
public DiscountLevel visit(Customer customer) {
11+
return switch (customer) {
12+
case RegularCustomer _ -> DiscountLevel.BRONZE;
13+
case CorporateCustomer _ -> DiscountLevel.SILVER;
14+
case PremiumCustomer _ -> DiscountLevel.GOLD;
15+
};
16+
}
17+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package pl.mperor.lab.java.design.pattern.behavioral.visitor;
2+
3+
public class InvitationLetterGenerator implements CustomerVisitor<Letter> {
4+
5+
public Letter generate(Customer customer) {
6+
return customer.accept(this);
7+
}
8+
9+
@Override
10+
public Letter visit(Customer customer) {
11+
var message = switch (customer) {
12+
case RegularCustomer _ -> "👨 Welcome normal customer!";
13+
case CorporateCustomer _ -> "‍💼 Welcome business customer!";
14+
case PremiumCustomer _ -> "🧑‍💼 Welcome vip customer!";
15+
};
16+
return new Letter(message);
17+
}
18+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package pl.mperor.lab.java.design.pattern.behavioral.visitor;
2+
3+
record Letter(String content) {
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package pl.mperor.lab.java.design.pattern.behavioral.visitor;
2+
3+
record PremiumCustomer() implements Customer {
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package pl.mperor.lab.java.design.pattern.behavioral.visitor;
2+
3+
record RegularCustomer() implements Customer {
4+
}

0 commit comments

Comments
 (0)