练习2:ATM简单流程
逻辑不难,重点在于匿名类的使用和 lambda表达式的应用,另外一定要谨记,写程序要一个功能块一个功能块完成,虽然一个类一个类完成在编写时比较顺,但在逻辑上不好,在出bug回查时也比较麻烦
类图:
1.基本流程
1.插卡
2.输入密码(验证)
3.根据卡(创建的对象),自动进入不同银行卡的界面
4.基础功能有:1.存钱 2.取钱 3.验证密码
5.BOC第三项改为充话费
6.ICBC第三项改为充水电费
2.自己的代码
public abstract class UnionCard {
public String cardId;
public int balance;
public int pw;
public UnionCard() {
}
public UnionCard(String cardId, int balance, int pw) {
this.cardId = cardId;
this.balance = balance;
this.pw = pw;
}
public String getCardId() {
return cardId;
}
public void setCardId(String cardId) {
this.cardId = cardId;
}
public double getBalance() {
return balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
public int getPw() {
return pw;
}
public void setPw(int pw) {
this.pw = pw;
}
public void saveMoney(int sm){
balance=balance+sm;
System.out.println("您现在的余额为"+balance);
}
public void takeMoney(int tm){
if(balance>=tm){
balance=balance-tm;
}else if(balance<tm){
System.out.println("您的余额不足,无法取钱");
}
System.out.println("您现在的余额为"+balance);
}
public boolean takePMoney(int money){
if(this.balance>=money){
this.balance=this.balance-money;
System.out.println("缴费成功!您现在的余额为"+balance);
return true;
}else{
System.out.println("缴费失败!您现在的余额为"+balance);
return false;
}
}
public boolean check(int spw){
if(pw==spw)
System.out.println("密码正确");
return false;
}
}
public class BOC extends UnionCard{
private PayTelInter pt;
public BOC(String cardId, int balance, int pw) {
super.setCardId(cardId);
super.setBalance(balance);
super.setPw(pw);
pt=money->{
if(this.getBalance()>=money){
super.setBalance((int) (this.getBalance()-money));
return true;
}else{
return false;
}
};
}
public PayTelInter getPt() {
return pt;
}
public void setPt(PayTelInter pt) {
this.pt = pt;
}
}
public interface PayTelInter {
boolean payTel(int money);
}
public class ATM {
public UnionCard uc;
static Scanner sc=new Scanner(System.in);
public void insert(UnionCard uc){
this.uc=uc;
System.out.println("请输入密码");
int b=sc.nextInt();
if(this.uc.getPw()==b){
System.out.println("密码正确");
if(uc instanceof BOC){
System.out.println("您已进入BOC菜单");
showBOCMenu(this.uc);
}if(uc instanceof ICBC){
System.out.println("您已进入ICBC菜单");
showICBCMenu(this.uc);
}
if(uc instanceof ABC){
System.out.println("您已进入ABC菜单");
showMenu(this.uc);
}
if(uc instanceof CCB){
System.out.println("您已进入CCB菜单");
showMenu(this.uc);
}
}else{
System.out.println("密码错误");
}
}
public void showMenu(UnionCard uc){
System.out.println("1.存钱");
System.out.println("2.取钱");
System.out.println("3.验证密码");
String c=sc.next();
if(c.equals("1")){
System.out.println("存多少钱");
int sm=sc.nextInt();
this.uc.saveMoney(sm);
showBOCMenu(this.uc);
}else if(c.equals("2")){
System.out.println("取所少钱");
int tm=sc.nextInt();
this.uc.takeMoney(tm);
showBOCMenu(this.uc);
}else if(c.equals("3")){
System.out.println("输入密码");
int spw=sc.nextInt();
this.uc.check(spw);
showMenu(this.uc);
}
}
public void showBOCMenu(UnionCard uc){
System.out.println("1.存钱");
System.out.println("2.取钱");
System.out.println("3.交电话费");
String c=sc.next();
if(c.equals("1")){
System.out.println("存多少钱");
int sm=sc.nextInt();
this.uc.saveMoney(sm);
showBOCMenu(this.uc);
}else if(c.equals("2")){
System.out.println("取所少钱");
int tm=sc.nextInt();
this.uc.takeMoney(tm);
showBOCMenu(this.uc);
}else if(c.equals("3")){
System.out.println("输入缴费金额");
int spw=sc.nextInt();
PayTelInter p=(money)->{
return this.uc.takePMoney(money);
};
if(p.payTel(spw)){
System.out.println("缴费成功");
showBOCMenu(this.uc);
}else{
System.out.println("余额不足");
showBOCMenu(this.uc);
}
}
}
public void showICBCMenu(UnionCard uc){
System.out.println("1.存钱");
System.out.println("2.取钱");
System.out.println("3.交水电费");
String c=sc.next();
if(c.equals("1")){
System.out.println("存多少钱");
int sm=sc.nextInt();
this.uc.saveMoney(sm);
showBOCMenu(this.uc);
}else if(c.equals("2")){
System.out.println("取所少钱");
int tm=sc.nextInt();
this.uc.takeMoney(tm);
showBOCMenu(this.uc);
}else if(c.equals("3")){
System.out.println("输入缴费金额");
int spw=sc.nextInt();
PayWEInter p=(money)->{
return this.uc.takePMoney(money);
};
if(p.payWE(spw)){
System.out.println("缴费成功");
showICBCMenu(this.uc);
}else{
System.out.println("余额不足");
showICBCMenu(this.uc);
}
}
}
}
public class MainClass {
public static void main(String[] args) {
ATM atm=new ATM();
UnionCard uc=new BOC("1",100,1);
atm.insert(uc);
}
}
3.老师的代码
public class UnionCard {
private String id;
private double balance;
private int pw;
public UnionCard(String id, double balance, int pw) {
super();
this.id = id;
this.balance = balance;
this.pw = pw;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
public int getPw() {
return pw;
}
public void setPw(int pw) {
this.pw = pw;
}
//存钱
public void saveMoney(int money){
this.balance=this.balance+money;
}
public boolean takeMoney(int money){
if(this.balance>=money){
this.balance=this.balance-money;
return true;
}else{
return false;
}
}
public boolean checkPw(int pw){
return this.pw==pw;
}
}
public class BOC extends UnionCard{
public BOC(String id, double balance, int pw) {
super(id, balance, pw);
}
}
public interface PayTelInter {
boolean payTel(int money);
}
public class ATM {
private UnionCard card;
public void insertCard(UnionCard card){
this.card=card;
//判断卡的类型
if(card instanceof BOC){
showbocMenu();
}
}
//显示中国银行的菜单
public void showbocMenu(){
Scanner sc=new Scanner(System.in);
System.out.println("请输入密码:");
int pw=sc.nextInt();
if(card.checkPw(pw)){
while(true){
System.out.println("1.查看余额 2.存钱 3.取钱 4.交话费 5.退出");
System.out.println("请选择");
int num=sc.nextInt();
switch(num){
case 1:
showBalance();
System.out.println("输入0返回");
if(0==sc.nextInt());//无实际意义,但可以不直接运行break导致余额不停留
break;
case 2:
saveBalance();
System.out.println("输入0返回");
if(0==sc.nextInt());//无实际意义,但可以不直接运行break导致余额不停留
break;
case 3:
takeBalance();
System.out.println("输入0返回");
if(0==sc.nextInt());//无实际意义,但可以不直接运行break导致余额不停留
break;
case 4:
payMethod();
System.out.println("输入0返回");
if(0==sc.nextInt());//无实际意义,但可以不直接运行break导致余额不停留
break;
case 5:
System.exit(0);
break;
}
}
}else{
System.out.println("密码错误");
}
}
private void showBalance(){
System.out.println("余额"+card.getBalance());
}
private void saveBalance(){
Scanner sc=new Scanner(System.in);
System.out.println("请输入金额");
int money=sc.nextInt();
card.saveMoney(money);
System.out.println("成功");
}
private void takeBalance(){
Scanner sc=new Scanner(System.in);
System.out.println("请输入金额");
int money=sc.nextInt();
boolean b=card.takeMoney(money);
if(b)
System.out.println("成功");
else{
System.out.println("余额不足");
}
}
private void payMethod(){
Scanner sc=new Scanner(System.in);
System.out.println("请输入充入的话费");
int money1=sc.nextInt();
PayTelInter p=(money)->{
return card.takeMoney(money);
};
if(p.payTel(money1)){
System.out.println("缴费成功");
}else{
System.out.println("余额不足");
}
}
}
public class MainClass {
public static void main(String[] args) {
new ATM().insertCard(new BOC("0001",100,123));
}
}