From a7ae8d782bb2fc97cdaf8c821349ca15871bcff0 Mon Sep 17 00:00:00 2001 From: KunwarVikas Date: Sun, 1 Jan 2023 14:49:16 +0530 Subject: [PATCH] Behavioral Design Pattern - Chain of Responsibility Pattern --- .../design/behavioral/cor/ATMDispenser.java | 32 +++++++++++++++++++ .../design/behavioral/cor/Currency.java | 15 +++++++++ .../design/behavioral/cor/DispenseChain.java | 9 ++++++ .../behavioral/cor/Dollar10Dispenser.java | 26 +++++++++++++++ .../behavioral/cor/Dollar20Dispenser.java | 25 +++++++++++++++ .../behavioral/cor/Dollar50Dispenser.java | 24 ++++++++++++++ 6 files changed, 131 insertions(+) create mode 100644 com/javadevjournal/design/behavioral/cor/ATMDispenser.java create mode 100644 com/javadevjournal/design/behavioral/cor/Currency.java create mode 100644 com/javadevjournal/design/behavioral/cor/DispenseChain.java create mode 100644 com/javadevjournal/design/behavioral/cor/Dollar10Dispenser.java create mode 100644 com/javadevjournal/design/behavioral/cor/Dollar20Dispenser.java create mode 100644 com/javadevjournal/design/behavioral/cor/Dollar50Dispenser.java diff --git a/com/javadevjournal/design/behavioral/cor/ATMDispenser.java b/com/javadevjournal/design/behavioral/cor/ATMDispenser.java new file mode 100644 index 0000000..c575c5e --- /dev/null +++ b/com/javadevjournal/design/behavioral/cor/ATMDispenser.java @@ -0,0 +1,32 @@ +package main.com.kunwar.designpatterns.behavioral.cor; +import java.util.Scanner; +/** + * @author Kunwar Vikas + */ +public class ATMDispenser { + private DispenseChain dispenseChain1; + public ATMDispenser() { + // initialize the chain + this.dispenseChain1 = new Dollar50Dispenser(); + DispenseChain dispenseChain2 = new Dollar20Dispenser(); + DispenseChain dispenseChain3 = new Dollar10Dispenser(); + + // set the chain of responsibility + dispenseChain1.setNextChain(dispenseChain2); + dispenseChain2.setNextChain(dispenseChain3); + } + + public static void main(String[] args) { + ATMDispenser atmDispenser = new ATMDispenser(); + int amount = 0; + System.out.print("Enter amount to dispense: "); + Scanner input = new Scanner(System.in); + amount = input.nextInt(); + if (amount % 10 != 0) { + System.out.println("Amount should be in multiple of 10s."); + return; + } + // process the request + atmDispenser.dispenseChain1.dispense(new Currency(amount)); + } +} \ No newline at end of file diff --git a/com/javadevjournal/design/behavioral/cor/Currency.java b/com/javadevjournal/design/behavioral/cor/Currency.java new file mode 100644 index 0000000..677c794 --- /dev/null +++ b/com/javadevjournal/design/behavioral/cor/Currency.java @@ -0,0 +1,15 @@ +package main.com.kunwar.designpatterns.behavioral.cor; + +/** + * @author Kunwar Vikas + */ +public class Currency { + private int amount; + + public Currency(int amount){ + this.amount=amount; + } + public int getAmount(){ + return this.amount; + } +} \ No newline at end of file diff --git a/com/javadevjournal/design/behavioral/cor/DispenseChain.java b/com/javadevjournal/design/behavioral/cor/DispenseChain.java new file mode 100644 index 0000000..f77fa27 --- /dev/null +++ b/com/javadevjournal/design/behavioral/cor/DispenseChain.java @@ -0,0 +1,9 @@ +package main.com.kunwar.designpatterns.behavioral.cor; + +/** + * @author Kunwar Vikas + */ +public interface DispenseChain { + void setNextChain(DispenseChain nextChain); + void dispense(Currency currency); +} \ No newline at end of file diff --git a/com/javadevjournal/design/behavioral/cor/Dollar10Dispenser.java b/com/javadevjournal/design/behavioral/cor/Dollar10Dispenser.java new file mode 100644 index 0000000..450d6a9 --- /dev/null +++ b/com/javadevjournal/design/behavioral/cor/Dollar10Dispenser.java @@ -0,0 +1,26 @@ +package main.com.kunwar.designpatterns.behavioral.cor; + +/** + * @author Kunwar Vikas + */ +public class Dollar10Dispenser implements DispenseChain { + private DispenseChain dispenseChain; + + @Override + public void setNextChain(DispenseChain nextChain) { + this.dispenseChain =nextChain; + } + + @Override + public void dispense(Currency currency) { + if(currency.getAmount() >= 10){ + int num = currency.getAmount()/10; + int remainder = currency.getAmount() % 10; + System.out.println("Dispensing "+num+" 10$ note"); + if(remainder !=0) this.dispenseChain.dispense(new Currency(remainder)); + }else{ + this.dispenseChain.dispense(currency); + } + } + +} \ No newline at end of file diff --git a/com/javadevjournal/design/behavioral/cor/Dollar20Dispenser.java b/com/javadevjournal/design/behavioral/cor/Dollar20Dispenser.java new file mode 100644 index 0000000..cb2f762 --- /dev/null +++ b/com/javadevjournal/design/behavioral/cor/Dollar20Dispenser.java @@ -0,0 +1,25 @@ +package main.com.kunwar.designpatterns.behavioral.cor; + +/** + * @author Kunwar Vikas + */ +public class Dollar20Dispenser implements DispenseChain { + private DispenseChain dispenseChain; + + @Override + public void setNextChain(DispenseChain nextChain) { + this.dispenseChain = nextChain; + } + @Override + public void dispense(Currency currency) { + if (currency.getAmount() >= 20) { + int num = currency.getAmount() / 20; + int remainder = currency.getAmount() % 20; + System.out.println("Dispensing " + num + " 20$ note"); + if (remainder != 0) this.dispenseChain.dispense(new Currency(remainder)); + } else { + this.dispenseChain.dispense(currency); + } + } +} + diff --git a/com/javadevjournal/design/behavioral/cor/Dollar50Dispenser.java b/com/javadevjournal/design/behavioral/cor/Dollar50Dispenser.java new file mode 100644 index 0000000..c89799f --- /dev/null +++ b/com/javadevjournal/design/behavioral/cor/Dollar50Dispenser.java @@ -0,0 +1,24 @@ +package main.com.kunwar.designpatterns.behavioral.cor; + +/** + * @author Kunwar Vikas + */ +public class Dollar50Dispenser implements DispenseChain { + private DispenseChain dispenseChain; + + @Override + public void setNextChain(DispenseChain nextChain) { + this.dispenseChain =nextChain; + } + @Override + public void dispense(Currency currency) { + if(currency.getAmount() >= 50){ + int num = currency.getAmount()/50; + int remainder = currency.getAmount() % 50; + System.out.println("Dispensing "+num+" 50$ note"); + if(remainder !=0) this.dispenseChain.dispense(new Currency(remainder)); + }else{ + this.dispenseChain.dispense(currency); + } + } +} \ No newline at end of file