package com.sheting.design.pattern.demo9;
/**
* @Author SheTing
* @Time 2018/3/22 9:59
*/
public class Dollar50Dispenser implements DispenseChain {
private DispenseChain chain;
@Override
public void setNextChain(DispenseChain nextChain) {
this.chain = nextChain;
}
@Override
public void dispense(Currency cur) {
if (cur.getAmount() >= 50) {
int num = cur.getAmount() / 50;
int remainder = cur.getAmount() % 50;
System.out.println("Dispensing " + num + " 50$ note");
if (remainder != 0) this.chain.dispense(new Currency(remainder));
} else {
this.chain.dispense(cur);
}
}
}
package com.sheting.design.pattern.demo9;
/**
* @Author SheTing
* @Time 2018/3/22 10:00
*/
public class Dollar20Dispenser implements DispenseChain {
private DispenseChain chain;
@Override
public void setNextChain(DispenseChain nextChain) {
this.chain = nextChain;
}
@Override
public void dispense(Currency cur) {
if (cur.getAmount() >= 20) {
int num = cur.getAmount() / 20;
int remainder = cur.getAmount() % 20;
System.out.println("Dispensing " + num + " 20$ note");
if (remainder != 0) this.chain.dispense(new Currency(remainder));
} else {
this.chain.dispense(cur);
}
}
}
package com.sheting.design.pattern.demo9;
/**
* @Author SheTing
* @Time 2018/3/22 10:00
*/
public class Dollar10Dispenser implements DispenseChain {
private DispenseChain chain;
@Override
public void setNextChain(DispenseChain nextChain) {
this.chain = nextChain;
}
@Override
public void dispense(Currency cur) {
if (cur.getAmount() >= 10) {
int num = cur.getAmount() / 10;
int remainder = cur.getAmount() % 10;
System.out.println("Dispensing " + num + " 10$ note");
if (remainder != 0) this.chain.dispense(new Currency(remainder));
} else {
this.chain.dispense(cur);
}
}
}
package com.sheting.design.pattern.demo9;
import java.util.Scanner;
/**
* @Author SheTing
* @Time 2018/3/22 10:01
*/
public class ATMDispenseChain{
private DispenseChain c1;
public ATMDispenseChain() {
// initialize the chain
this.c1 = new Dollar50Dispenser();
DispenseChain c2 = new Dollar20Dispenser();
DispenseChain c3 = new Dollar10Dispenser();
// set the chain of responsibility
c1.setNextChain(c2);
c2.setNextChain(c3);
}
public static void main(String[] args) {
ATMDispenseChain atmDispenser = new ATMDispenseChain();
while (true) {
int amount = 0;
System.out.println("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.c1.dispense(new Currency(amount));
}
}
}