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

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+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.phint2.pattern.behavioral.cor.logger;
2+
3+
public class AppLogger {
4+
5+
public static Logger getLogger() {
6+
7+
Logger consoleLogger = new ConsoleLogger(LogLevel.DEBUG);
8+
Logger fileLogger = consoleLogger.setNext(new FileLogger(LogLevel.ERROR));
9+
fileLogger.setNext(new MailLogger(LogLevel.FATAL));
10+
return consoleLogger;
11+
}
12+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.phint2.pattern.behavioral.cor.logger;
2+
3+
/*
4+
* Chain of Responsibility Pattern Example
5+
* */
6+
public class Client {
7+
8+
public static void main(String[] args) {
9+
10+
// Build the chain of responsibility
11+
Logger logger = AppLogger.getLogger();
12+
13+
// Handled by ConsoleLogger since the console has a LogLevel of DEBUG
14+
logger.log(LogLevel.INFO, "Info message");
15+
logger.log(LogLevel.DEBUG, "Debug message");
16+
17+
// Handled by ConsoleLogger and FileLogger
18+
logger.log(LogLevel.ERROR, "Error message");
19+
20+
// Handled by ConsoleLogger, FileLogger, MailLogger
21+
logger.log(LogLevel.FATAL, "Fatal message");
22+
}
23+
}
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.logger;
2+
3+
public class ConsoleLogger extends Logger {
4+
5+
public ConsoleLogger(LogLevel logLevel) {
6+
super(logLevel);
7+
}
8+
9+
@Override
10+
protected void writeMessage(String message) {
11+
System.out.println("Console logger: " + message);
12+
}
13+
}
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.logger;
2+
3+
public class FileLogger extends Logger {
4+
5+
public FileLogger(LogLevel logLevel) {
6+
super(logLevel);
7+
}
8+
9+
@Override
10+
protected void writeMessage(String message) {
11+
System.out.println("File logger: " + message);
12+
}
13+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.phint2.pattern.behavioral.cor.logger;
2+
3+
public enum LogLevel {
4+
5+
NONE(0),
6+
INFO(1),
7+
DEBUG(2),
8+
WARNING(4),
9+
ERROR(8),
10+
FATAL(16),
11+
ALL(32);
12+
13+
private int level;
14+
15+
private LogLevel(int level) {
16+
this.level = level;
17+
}
18+
19+
public int getLevel() {
20+
return level;
21+
}
22+
}
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.logger;
2+
3+
public abstract class Logger {
4+
5+
protected LogLevel logLevel;
6+
protected Logger nextLogger; // The next Handler in the chain
7+
8+
public Logger(LogLevel logLevel) {
9+
this.logLevel = logLevel;
10+
}
11+
12+
// Set the next logger to make a list/chain of Handlers.
13+
public Logger setNext(Logger nextLogger) {
14+
this.nextLogger = nextLogger;
15+
return nextLogger;
16+
}
17+
18+
public void log(LogLevel severity, String message) {
19+
if (this.logLevel.getLevel() <= severity.getLevel()) {
20+
writeMessage(message);
21+
}
22+
if (nextLogger != null) {
23+
nextLogger.log(severity, message);
24+
}
25+
}
26+
27+
protected abstract void writeMessage(String message);
28+
}
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.logger;
2+
3+
public class MailLogger extends Logger {
4+
5+
public MailLogger(LogLevel logLevel) {
6+
super(logLevel);
7+
}
8+
9+
@Override
10+
protected void writeMessage(String message) {
11+
System.out.println("Mail logger: " + message);
12+
}
13+
}

0 commit comments

Comments
 (0)