Java基础进阶——经典案例实现银行ATM机详细代码系统功能

本次项目中我们选用当前热门的MVC框架来简单搭建

经典MVC模式中,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。其中,View的定义比较清晰,就是用户界面。

要求:实现银行ATM机基本功能

我这边采用的是二级菜单,**第一层就是登录、注册两个功能。登录成功后进入操作界面,1.存款 2.取款3.余额4.修改密码5.转账 6.退出当前账号 7.退出, 这7个功能。**基本功能还是蛮简单的哈,因为要采用MVC模式,所以我们先把层分好,再开始思考该怎么一步步的实现。

项目分层

我这边定义了四个包,bean包用来创建实例化对象,dao包用来创建存储所有的对象,sevice包服务层用来创建操作实例化的对象,view展示层顾名思义,就是用来给用户看的撒,实现用户看到的界面。
Java基础进阶——经典案例实现银行ATM机详细代码系统功能_第1张图片

理清逻辑——一切easy、easy

大家不要看到这么多的包就觉得很复杂哈,它就和我们之前写的项目一样,只是把它细分出来了,其实一个包里面也就只有一个类。所以不要慌张,我们还是一步步的来。
第一步先创建实体类嘛,就在bean包下新建一个Acount类,它有姓名(name)、密码(password)、卡号(cardid)、余额(blance)四个基本属性,为了方便测试可以重写它的toString()方法。这里为了规范属性都有私有化哦!然后在生成属性的get()、set()方法,创建两个构造方法,一个无参,一个有参的。

第二步,那实体类创建完了,我们该干嘛呢?我们还需要一个存放Acount对象的集合是不,所以我们在dao包下创建一个AcountDao类,它只有一个私有的ArrayList集合acountDaos,同样的需要生成它的get()、set()方法!

第三步,实体类和装它对象的集合都有了,下一步我们就需要创建一个方法类,来一一实现需要的操作,所以我们在Service包下创建一个AcountService类,注册、登录、存钱、取钱、查看余额、修改密码方法这些方法都是在它里面实现的。

最后就是在view包中创建一个AcountView类,用来给用户进行展示,也就相当于我们当初的Test测试类!

一步一个脚印

按照咱们的逻辑,先编写bean包下的Acount类,具体代码如下:

package bean;
/*
账户类  拥有姓名、密码、卡号、余额四个基本属性
 */
public class Acount {
    private  String name;
    private  String password;
    private  String cardid;
    private  Double blance;

    public Acount() {
    }

    public Acount(String name, String password, String cardid, Double blance) {
        this.name = name;
        this.password = password;
        this.cardid = cardid;
        this.blance = blance;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getCardid() {
        return cardid;
    }

    public void setCardid(String cardid) {
        this.cardid = cardid;
    }

    public Double getBlance() {
        return blance;
    }

    public void setBlance(Double blance) {
        this.blance = blance;
    }

    @Override
    public String toString() {
        return
                "您的用户名为" + name +
                ", 密码为:" + password +
                ", 卡号为:" + cardid  +
                ", 余额为:" + blance;
    }

}

这就不给大家过多解释了哈!easy、easy
再来编写我们dao层下的AcountDao()类,具体代码如下:

package dao;

import bean.Acount;

import java.util.ArrayList;

/*
 */
public class AcountDao {

    private ArrayList acountDaos = new ArrayList<>();


    public ArrayList getAcountDaos() {
        return acountDaos;
    }

    public void setAcountDaos(ArrayList acountDaos) {
        this.acountDaos = acountDaos;
    }

/*    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Acount)) return false;
        Acount acount = (Acount) o;
        for (Acount a: getAcountDaos()) {
            if (acount.getCardid().equals(a.getCardid())){
                return true;
            }
        }
        return false;
    }*/

/*    @Override
    public int hashCode() {
        return 0;
    }*/
}

这里我注释的代码是当时想着将Acount对象添加进去时,如果它的银行卡号相同,就添加失败。相当于银行卡号是唯一的,不可重复。后来想了想,没必要。因为我银行卡号是随机创建的,相同的概率是十万分之一,大家写上也可以。
好,前两个解决之后,咱们就开始第三个service包下的AcountService类实现,具体代码如下:

package service;

import bean.Acount;
import dao.AcountDao;

import java.util.Random;
import java.util.Scanner;

/*
账户操作类 。拥有 注册、登录、存钱、取钱、查看余额、修改密码方法
 */
public class AcountService {
    public  Acount acount = new Acount();
    public AcountDao acountDao = new AcountDao();
    public  Scanner sc = new Scanner(System.in);

    /*
    注册
     */
    public void register(){
        Acount acount = new Acount();
        System.out.println("请输入用户名:");
        acount.setName(sc.next());
        System.out.println("请输入密码:");
        acount.setPassword(sc.next());
        //生成一个13位的随机数来表示用户的唯一标识卡号
        Random random = new Random();
        String cardid = String.valueOf(random.nextInt(100000000)+999999999);
        acount.setCardid(cardid);
        acount.setBlance(0.0);
        this.acount = acount;
        // 将用户添加进用户集合
        acountDao.getAcountDaos().add(acount);
        for (Acount a:acountDao.getAcountDaos()) {
            System.out.println(a);
        }
        System.out.println("注册成功");
        System.out.println("*******************************************************************************************");
    }

    /*
    登录
     */
    public Acount login(){
        Acount acount = new Acount();
        System.out.println("请输入卡号:");

        acount.setCardid(sc.next());
        System.out.println("请输入密码:");
        acount.setPassword(sc.next());
        int n = 0;
        for (Acount a: acountDao.getAcountDaos()) {
            if(acount.getCardid().equals(a.getCardid()) && acount.getPassword().equals(a.getPassword())){
                n = 1;
                System.out.println("登录成功");
                this.acount = a;
                System.out.println("*******************************************************************************************");
                return a;
            }
        }
        if (n == 0){
            System.out.println("卡号或密码错误,请重新输入:");
        }
        return null;
    }

    /*
    存钱
     */
    public  void saveMoney(){
        System.out.println("要存多少钱呢");
        double money = sc.nextInt();
        if (money<0){
            System.out.println("好家伙,你到底是存还是取?");
            return;
        }
        this.acount.setBlance(this.acount.getBlance()+money);
        System.out.println("存钱成功");
        System.out.println("*******************************************************************************************");
    }

    /*
    取钱
     */
    public  void drawMoney(){

        System.out.println("要取多少钱呢?");
        double money = sc.nextInt();
        if (money<0){
            System.out.println("好家伙,你到底是存还是取?");
            return;
        }
        if (money > this.acount.getBlance()){
            System.out.println("好家伙,你都没有这么多钱?怎么取呢");
        }else {
            acount.setBlance(this.acount.getBlance()-money);
            System.out.println("取钱成功");
            System.out.println("*******************************************************************************************");
        }
    }

    /*
    查看余额
     */
    public  void checkMoney(){

        System.out.println("您的余额为:"+this.acount.getBlance());
        System.out.println("*******************************************************************************************");
    }

    /*
    修改密码
     */
    public void  updatePwd(){
        System.out.println("请输入新密码:");
        String pwd = sc.next();
        acount.setPassword(pwd);
        System.out.println("修改完成,请重新登录");
        System.out.println("*******************************************************************************************");
    }

    /*
    转账
     */
    public  void  transferAcount(){
        System.out.println("请输入转账的卡号:");
        String cardid = sc.next();
        int n =0;
        for (Acount a:acountDao.getAcountDaos()) {
            if (cardid.equals(a.getCardid())){
                n = 1;
            }
        }
        if (n == 0){
            System.out.println("没有找到该卡号!");
            return;
        }
        System.out.println("请输入转账的金额:");
        double d = sc.nextDouble();
        if (d > this.acount.getBlance()){
            System.out.println("???空手套白狼,你有这么多钱吗?就转账??");
            return;
        }

        for (Acount a:acountDao.getAcountDaos()) {
            if (cardid.equals(a.getCardid())){
                n = 1;
                this.acount.setBlance(this.acount.getBlance() - d);
                a.setBlance(a.getBlance()+d);
                System.out.println("转账成功");
            }
        }
    }
}


看着代码有点多,不慌,咱们一个个的来解决,首先我们看到的第一个注册login()方法我创建了一个Acount对象和一个AcountDao对象,acount是为了我们登录之后用来记住当前对象的,acountdao是让我们来调用它的getAcoutDao方法的。在第一个注册方法中,我首先新new了一个Acount对象,用来将用户输入的信息,保存到其中,随后生成了一个随机数,因为int类型最大取不到13位,我就取了10位~,用来当做它的银行卡号。随后将acount的对象的初始余额赋值为0。随后将它添加进咱们的用户集合。随后将acountdao集合中的所有属性全部打印出来。
Java基础进阶——经典案例实现银行ATM机详细代码系统功能_第2张图片
接着就是我们的第二个登录login()方法,前面的代码和注册一样,在foreach循环这儿,我判断用户输入的卡号和密码,是否都和我整个aountDao集合中的其中一个对象相等,如果相等,就提示登录成功,并将集合中的这个对象赋给我的成员变量acount,这样,我登录之后所有的操作都是该账户的改动。这一步大家可以多看看。我语言组织的不是很好哈~~~

Java基础进阶——经典案例实现银行ATM机详细代码系统功能_第3张图片
第三个存钱的方法,就很easy啦。先判断用户输入的金额是否合理,合理就将用户输入的金额加上用户原本的金额通过setBlance方法写入到对象中。

第四个取钱的方法,大同小异,就不赘述咯!

第五、六个查看余额、修改密码的方法…easy

第七个方法,转账。这儿我们首先获取用户输入的要转账的卡号,进行循环判断,如果不存在返回。如果存在,再要求用户输入转账金额,如果输入的金额大于用户账户的金额,返回。如果金额<用户账户的金额,则将用户的金额 - 转账的金额。将转账银行卡号的金额 + 转账的金额。也就结束啦!

最后就是咱们View包下的AcountView类实现,具体代码如下:

package view;

import bean.Acount;
import service.AcountService;

import java.util.Scanner;

public class AcountView {
    public static Scanner sc = new Scanner(System.in);
    public static AcountService acountService = new AcountService();
    public static Acount acount = new Acount();

    public static void main(String[] args) {
        showMenu();
    }

    public static void showMenu() {
        while (true) {
            System.out.println("请选择操作:1.注册\t2.登录");
            int n = sc.nextInt();
            switch (n) {
                case 1:
                    acountService.register();
                    break;
                case 2:
                    acount = acountService.login();
                    if (acount != null) {
                        succeedLogin();
                    }
                    break;
                default:
                    System.out.println("输入有误,请重新输入");
                    break;
            }
        }

    }

    public static void succeedLogin() {

        while (true) {
            System.out.println("请选择操作:1.存款\t2.取款\t3.余额\t4.修改密码\t5.转账\t6.退出当前账号\t7.退出");
            int n = sc.nextInt();
            switch (n) {
                case 1:
                    acountService.saveMoney();
                    break;
                case 2:
                    acountService.drawMoney();
                    break;
                case 3:
                    acountService.checkMoney();
                    break;
                case 4:
                    acountService.updatePwd();
                    showMenu();
                    break;
                case 5:
                    acountService.transferAcount();
                    break;
                case 6:
                    showMenu();
                    break;
                case 7:
                    System.exit(0);
                    break;
                default:
                    System.out.println("输入有误,请重新输入");
            }
        }
    }
}

这个我写了两个页面,第一个登录注册页,登录成功后进入第二个页面,退出当前账户就是回到也页面一!!!全部代码就是这些咯。最后再给大家看看具体效果!

今天的分享就到这儿咯!大家看完记得给个一键三连哇!!!!

你可能感兴趣的:(java基础,java)