Skip to content

Commit 36817ec

Browse files
committed
Merge branch 'release/design-pattern-v3.0.0-rl-211022-implement-chain-of-responsibility-pattern'
2 parents b0aba86 + ed1e45b commit 36817ec

File tree

17 files changed

+267
-2
lines changed

17 files changed

+267
-2
lines changed

README.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,19 @@ Reference: https://gpcoder.com/4626-huong-dan-java-design-pattern-flyweight/
7070
7171
### Proxy
7272

73-
https://gpcoder.com/4644-huong-dan-java-design-pattern-proxy/
73+
Reference: https://gpcoder.com/4644-huong-dan-java-design-pattern-proxy/
7474

7575
> Review: Useful for lazy loading
76+
77+
<hr/>
78+
79+
## Behavior
80+
81+
### Chain of Responsibility
82+
83+
Reference: https://gpcoder.com/4665-huong-dan-java-design-pattern-chain-of-responsibility/
84+
85+
> Review:
86+
>
87+
> - Suitable for create and push Alert through applications (tools) by level
88+
> - Summary: Execute an action by level chain, which has corresponding condition for each level

design-pattern/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>com.phint2</groupId>
88
<artifactId>design-pattern</artifactId>
9-
<version>2.6.0</version>
9+
<version>3.0.0</version>
1010

1111
<properties>
1212
<maven.compiler.source>8</maven.compiler.source>
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.phint2.pattern.behavioral.cor.leaverequest;
2+
3+
public abstract class Approver {
4+
5+
protected Approver nextApprover;
6+
7+
public void approveLeave(LeaveRequest request) {
8+
System.out.println("Checking permission for " + this.getClass().getSimpleName());
9+
10+
if (this.canApprove(request.getDays())) {
11+
this.doApproving(request);
12+
} else if (nextApprover != null) {
13+
nextApprover.approveLeave(request);
14+
}
15+
}
16+
17+
public void setNext(Approver approver) {
18+
this.nextApprover = approver;
19+
}
20+
21+
protected void doApproving(LeaveRequest request) {
22+
System.out.println("Leave request approved for " + request.getDays() + " days by " + getTitle());
23+
}
24+
25+
protected abstract String getTitle();
26+
27+
protected abstract boolean canApprove(int numberOfDays);
28+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.phint2.pattern.behavioral.cor.leaverequest;
2+
3+
public enum ApproverPermission {
4+
5+
Supervisor(3),
6+
DeliveryManage(5),
7+
Director(Integer.MAX_VALUE);
8+
9+
private int days;
10+
11+
private ApproverPermission(int days) {
12+
this.days = days;
13+
}
14+
15+
public int getDays() {
16+
return this.days;
17+
}
18+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.phint2.pattern.behavioral.cor.leaverequest;
2+
3+
public class Client {
4+
5+
public static void main(String[] args) {
6+
7+
LeaveRequestWorkFlow.getApprover().approveLeave(new LeaveRequest(8));
8+
System.out.println("---");
9+
LeaveRequestWorkFlow.getApprover().approveLeave(new LeaveRequest(2));
10+
System.out.println("---");
11+
LeaveRequestWorkFlow.getApprover().approveLeave(new LeaveRequest(5));
12+
}
13+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.phint2.pattern.behavioral.cor.leaverequest;
2+
3+
public class DeliveryManage extends Approver {
4+
5+
@Override
6+
protected String getTitle() {
7+
return "Delivery Manager";
8+
}
9+
10+
@Override
11+
protected boolean canApprove(int numberOfDays) {
12+
return numberOfDays <= ApproverPermission.DeliveryManage.getDays();
13+
}
14+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.phint2.pattern.behavioral.cor.leaverequest;
2+
3+
public class Director extends Approver {
4+
@Override
5+
protected String getTitle() {
6+
return "Director";
7+
}
8+
9+
@Override
10+
protected boolean canApprove(int numberOfDays) {
11+
return numberOfDays > ApproverPermission.DeliveryManage.getDays();
12+
}
13+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.phint2.pattern.behavioral.cor.leaverequest;
2+
3+
public class LeaveRequest {
4+
5+
private int days;
6+
7+
public LeaveRequest(int days) {
8+
this.days = days;
9+
}
10+
11+
public int getDays() {
12+
return this.days;
13+
}
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.phint2.pattern.behavioral.cor.leaverequest;
2+
3+
public class LeaveRequestWorkFlow {
4+
5+
public static Approver getApprover() {
6+
Approver supervisor = new Supervisor();
7+
Approver manager = new DeliveryManage();
8+
Approver director = new Director();
9+
10+
supervisor.setNext(manager);
11+
manager.setNext(director);
12+
return supervisor;
13+
}
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.phint2.pattern.behavioral.cor.leaverequest;
2+
3+
public class Supervisor extends Approver {
4+
5+
@Override
6+
protected String getTitle() {
7+
return "Supervisor";
8+
}
9+
10+
@Override
11+
protected boolean canApprove(int numberOfDays) {
12+
return numberOfDays <= ApproverPermission.Supervisor.getDays();
13+
}
14+
}

0 commit comments

Comments
 (0)