File tree 17 files changed +267
-2
lines changed
src/main/java/com/phint2/pattern/behavioral/cor
17 files changed +267
-2
lines changed Original file line number Diff line number Diff line change @@ -70,6 +70,19 @@ Reference: https://gpcoder.com/4626-huong-dan-java-design-pattern-flyweight/
70
70
71
71
### Proxy
72
72
73
- https://gpcoder.com/4644-huong-dan-java-design-pattern-proxy/
73
+ Reference: https://gpcoder.com/4644-huong-dan-java-design-pattern-proxy/
74
74
75
75
> 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
Original file line number Diff line number Diff line change 6
6
7
7
<groupId >com.phint2</groupId >
8
8
<artifactId >design-pattern</artifactId >
9
- <version >2.6 .0</version >
9
+ <version >3.0 .0</version >
10
10
11
11
<properties >
12
12
<maven .compiler.source>8</maven .compiler.source>
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments