Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Chain of responsibility design pattern #19

Open
wants to merge 6 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 32 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,32 @@
# DesignPatternsJava9
This repo consists Gang of Four Design patterns code on Java 9. Each branch in the repository has code of 1 design pattern. Switch repository to try out different design patterns.
# What is Command Design Pattern
Command encapsulate all information needed to perform an action. It allows the requester of a particular action to be decoupled from the object that performs the action.

## Diagram
![Diagram](https://github.com/premaseem/DesignPatternsJava9/blob/chain-of-responsibility/diagrams/template-method-Pattern-class-diagram.jpeg "Diagram")

![Diagram](https://github.com/premaseem/DesignPatternsJava9/blob/chain-of-responsibility/diagrams/Template-method-Design-Pattern-generic.jpeg "Diagram")

![Diagram](https://github.com/premaseem/DesignPatternsJava9/blob/chain-of-responsibility/diagrams/template-method-sequence.png "Diagram")

### When to use Command Design Pattern
The invoker should be decoupled from the object handling the invocation.

### Learn Design Patterns with Java by Aseem Jain
This repository contains working project code used in video Course by Packt Publication with title "Learn Design Patterns with Java " authored by "Aseem Jain".

### Course link:
https://www.packtpub.com/application-development/learn-design-patterns-java-9-video

### ![ http://in.linkedin.com/in/premaseem](https://github.com/premaseem/DesignPatternsJava9/blob/master/linkedin.png "http://in.linkedin.com/in/premaseem") Profile: http://in.linkedin.com/in/premaseem

### Authors blog on design patterns:
https://premaseem.wordpress.com/category/computers/design-patterns/

### Software Design pattern community face book page:
https://www.facebook.com/DesignPatternGuru/

### Note:
* This code base will work on Java 9 and above versions.
* `diagrams` folders carry UML diagrams.
* `pattern` folder has code of primary example.
* `patternBonus` folder has code of secondary or bonus example.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added diagrams/template-method-sequence.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
52 changes: 52 additions & 0 deletions pattern/src/com/premaseem/ATMmoneyDispenser/Client.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.premaseem.ATMmoneyDispenser;

/*
@author: Aseem Jain
@title: Design Patterns with Java 9
@link: https://premaseem.wordpress.com/category/computers/design-patterns/
*/

import java.util.Scanner;

public class Client {

public static void main(String[] args) {

System.out.println("Welcome to ATM Money dispenser program designed using Chain of Responsibility");
Scanner scan = new Scanner(System.in);

MoneyChainHandler hundredDollarHandler_100 = new HundrenDollarHandler_100(100);
MoneyChainHandler fiftyDollarHandler_50 = new FiftyDollarHandler_50(50);
MoneyChainHandler tenDollarHandler_10 = new TenDollarHandler_10(10);
MoneyChainHandler fiveDollarHandler_5 = new FiveDollarHandler_5(5);
MoneyChainHandler twoDollarHandler_2 = new TwoDollarHandler_2(2);
MoneyChainHandler oneDollarHandler_1 = new OneDollarHandler_1(1);

// Setting up the change
hundredDollarHandler_100.setNextHandler(fiftyDollarHandler_50);
fiftyDollarHandler_50.setNextHandler(tenDollarHandler_10);
tenDollarHandler_10.setNextHandler(fiveDollarHandler_5);
fiveDollarHandler_5.setNextHandler(twoDollarHandler_2);
twoDollarHandler_2.setNextHandler(oneDollarHandler_1);

String repeatRunFlag = "y";
while (!repeatRunFlag.equalsIgnoreCase("no")) {
System.out.println("Please enter amount you want to withdraw eg 3450 ");
int choice = scan.nextInt();
hundredDollarHandler_100.handler(choice);

System.out.println("=============================");

System.out.println("Press No to Exit and any other character to repeat .... ");
try {
repeatRunFlag = scan.next();
} catch (Exception e) {
repeatRunFlag = "n";
}
}

System.out.println("\n $$$$$$$$$$$$$$$$$$$$ Thanks by Prem Aseem $$$$$$$$$$$$$$$$$$$$$$ \n ");
System.out.println("\n $$$$$$$$$$$$$$$$$$$$$ www.premaseem.me $$$$$$$$$$$$$$$$$$$$$$ \n ");

}
}
66 changes: 66 additions & 0 deletions pattern/src/com/premaseem/ATMmoneyDispenser/MoneyChainHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package com.premaseem.ATMmoneyDispenser;

/*
@author: Aseem Jain
@title: Design Patterns with Java 9
@link: https://premaseem.wordpress.com/category/computers/design-patterns/
*/

public abstract class MoneyChainHandler {
MoneyChainHandler nextHandler = null;
Integer noteDenomination = 0;

public MoneyChainHandler setNextHandler (MoneyChainHandler nextHandler) {
this.nextHandler = nextHandler;
return this.nextHandler;
}

public void handler (int dollarBill) {
int notes = dollarBill / noteDenomination;
int remainingAmount = dollarBill % noteDenomination;

if (notes > 0) {
System.out.printf("dispatched %d X %d = %d handled by %s \n", noteDenomination, notes, (noteDenomination * notes), this.getClass().getSimpleName());
}
if (nextHandler != null && remainingAmount > 0) {
nextHandler.handler(remainingAmount);
}
}

}

class HundrenDollarHandler_100 extends MoneyChainHandler {
public HundrenDollarHandler_100 (Integer noteDenomination) {
this.noteDenomination = noteDenomination;
}
}

class FiftyDollarHandler_50 extends MoneyChainHandler {
public FiftyDollarHandler_50 (Integer noteDenomination) {
this.noteDenomination = noteDenomination;
}
}

class TenDollarHandler_10 extends MoneyChainHandler {
public TenDollarHandler_10 (Integer noteDenomination) {
this.noteDenomination = noteDenomination;
}
}

class FiveDollarHandler_5 extends MoneyChainHandler {
public FiveDollarHandler_5 (Integer noteDenomination) {
this.noteDenomination = noteDenomination;
}
}

class TwoDollarHandler_2 extends MoneyChainHandler {
public TwoDollarHandler_2 (Integer noteDenomination) {
this.noteDenomination = noteDenomination;
}
}

class OneDollarHandler_1 extends MoneyChainHandler {
public OneDollarHandler_1 (Integer noteDenomination) {
this.noteDenomination = noteDenomination;
}
}
13 changes: 0 additions & 13 deletions pattern/src/com/premaseem/Client.java

This file was deleted.

13 changes: 0 additions & 13 deletions patternBonus/src/com/premaseem/Client.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package com.premaseem.chainOfResponsibility.loggerProgram;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class ClientFileForLoggerProgram {

public static void main(String[] args) {

System.out.println("Welcome to Logger program designed using Chain of Responsibility ");
Scanner scan = new Scanner(System.in);
LogHandler logHandler;
LogHandler allLogLevelHandler = new AllLogLevelHandler();
LogHandler debugLogHandler = new DebugLogHandler();
LogHandler errorLogHandler = new ErrorLogHandler();
LogHandler fatalLogHandler = new FatalLogHandler();
LogHandler criticalLogHandler = new CriticalLogHandler();

// Setting up the chain
allLogLevelHandler.setNextHandler(debugLogHandler);
debugLogHandler.setNextHandler(errorLogHandler);
errorLogHandler.setNextHandler(fatalLogHandler);
fatalLogHandler.setNextHandler(criticalLogHandler);

// Log level priority, high rank covers all below handlers
List<LogHandler> logHandlers = new ArrayList<LogHandler>(10);
logHandlers.add(0,allLogLevelHandler);
logHandlers.add(1,debugLogHandler);
logHandlers.add(2,errorLogHandler);
logHandlers.add(3,fatalLogHandler);
logHandlers.add(4,criticalLogHandler);

String repeatRunFlag = "y";
while (!repeatRunFlag.equalsIgnoreCase("no")) {
System.out.println("Please enter message to be logged ");
String message = scan.next();
System.out.println("Please choose the level from 1 to 5 for logging ");
System.out.println("INFO(5), DEBUG(4), ERROR(3), FATAL(2), CRITICAL(1)");
try{
int choice = scan.nextInt();
logHandler = logHandlers.get(choice);
}catch (Exception e){
logHandler = logHandlers.get(0);
}

logHandler.handler(message);

System.out.println("=============================");

System.out.println("Press No to Exit and any other character to repeat .... ");
try {
repeatRunFlag = scan.next();
} catch (Exception e) {
repeatRunFlag = "n";
}
}

System.out.println("\n $$$$$$$$$$$$$$$$$$$$ Thanks by Prem Aseem $$$$$$$$$$$$$$$$$$$$$$ \n ");
System.out.println("\n $$$$$$$$$$$$$$$$$$$$$ www.premaseem.me $$$$$$$$$$$$$$$$$$$$$$ \n ");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.premaseem.chainOfResponsibility.loggerProgram;

public abstract class LogHandler {


public enum LOG_LEVEL {
INFO(5),
DEBUG(4),
ERROR(3),
FATAL(2),
CRITICAL(1);

Integer priority =1;
LOG_LEVEL(int priorityLevel){
priority = priorityLevel;
}
}

LogHandler nextHandler = null;

public void setNextHandler(LogHandler nextHandler) {
this.nextHandler = nextHandler;
}

public void handler(String message) {
System.out.printf(" %s console is printing message = %S \n " , this.getClass().getSimpleName(), message );
if(nextHandler !=null){
nextHandler.handler(message);
}
}
}

class AllLogLevelHandler extends LogHandler{

}

class DebugLogHandler extends LogHandler{

}

class ErrorLogHandler extends LogHandler{

}

class FatalLogHandler extends LogHandler{

}

class CriticalLogHandler extends LogHandler{

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.premaseem.chainOfResponsibility.numberHandler;

/*
@author: Aseem Jain
@title: Design Patterns with Java 9
@link: https://premaseem.wordpress.com/category/computers/design-patterns/
*/

import java.util.Scanner;

public class Client {

public static void main(String[] args) {

System.out.println("Welcome to Number identifier program designed using Chain of Responsibility ");
Scanner scan = new Scanner(System.in);

NumberChain positiveNumberHandler = new PositiveNumberHandler();
NumberChain negativeNumberHandler = new NegativeNumberHandler();
NumberChain neutralNumberHandler = new ZeroNumberHandler();

// Setting up the chain
positiveNumberHandler.setNextHandler(negativeNumberHandler);
negativeNumberHandler.setNextHandler(neutralNumberHandler);

String repeatRunFlag = "y";
while (!repeatRunFlag.equalsIgnoreCase("no")) {
System.out.println("Please enter any number 0, less then or greater then zero eg. -22 or 89 ? ");
int choice = scan.nextInt();
positiveNumberHandler.handler(choice);

System.out.println("=============================");

System.out.println("Press No to Exit and any other character to repeat .... ");
try {
repeatRunFlag = scan.next();
} catch (Exception e) {
repeatRunFlag = "n";
}
}

System.out.println("\n $$$$$$$$$$$$$$$$$$$$ Thanks by Prem Aseem $$$$$$$$$$$$$$$$$$$$$$ \n ");
System.out.println("\n $$$$$$$$$$$$$$$$$$$$$ www.premaseem.me $$$$$$$$$$$$$$$$$$$$$$ \n ");

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.premaseem.chainOfResponsibility.numberHandler;

public abstract class NumberChain {

NumberChain nextHandler = null;

public NumberChain setNextHandler(NumberChain nextHandler) {
this.nextHandler = nextHandler;
return this.nextHandler;
}

public abstract void handler(int requestNumber);

}

class PositiveNumberHandler extends NumberChain {

@Override
public void handler(int requestNumber) {
if (requestNumber > 0) {
System.out.println(this.getClass().getSimpleName() +" handled number " + requestNumber);
}else{
if(nextHandler!=null)
nextHandler.handler(requestNumber);
}
}
}

class NegativeNumberHandler extends NumberChain {

@Override
public void handler(int requestNumber) {
if (requestNumber < 0) {
System.out.println(this.getClass().getSimpleName() +" handled number " + requestNumber);
}else{
if(nextHandler!=null)
nextHandler.handler(requestNumber);
}
}
}

class ZeroNumberHandler extends NumberChain {

@Override
public void handler(int requestNumber) {
if (requestNumber == 0) {
System.out.println(this.getClass().getSimpleName() +" handled number " + requestNumber);
}else{
if(nextHandler!=null)
nextHandler.handler(requestNumber);
}
}
}