经典MVC模式中,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。其中,View的定义比较清晰,就是用户界面。
我这边采用的是二级菜单,**第一层就是登录、注册两个功能。登录成功后进入操作界面,1.存款 2.取款3.余额4.修改密码5.转账 6.退出当前账号 7.退出, 这7个功能。**基本功能还是蛮简单的哈,因为要采用MVC模式,所以我们先把层分好,再开始思考该怎么一步步的实现。
我这边定义了四个包,bean包用来创建实例化对象,dao包用来创建存储所有的对象,sevice包服务层用来创建操作实例化的对象,view展示层顾名思义,就是用来给用户看的撒,实现用户看到的界面。
大家不要看到这么多的包就觉得很复杂哈,它就和我们之前写的项目一样,只是把它细分出来了,其实一个包里面也就只有一个类。所以不要慌张,我们还是一步步的来。
第一步先创建实体类嘛,就在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集合中的所有属性全部打印出来。
接着就是我们的第二个登录login()方法,前面的代码和注册一样,在foreach循环这儿,我判断用户输入的卡号和密码,是否都和我整个aountDao集合中的其中一个对象相等,如果相等,就提示登录成功,并将集合中的这个对象赋给我的成员变量acount,这样,我登录之后所有的操作都是该账户的改动。这一步大家可以多看看。我语言组织的不是很好哈~~~
第三个存钱的方法,就很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("输入有误,请重新输入");
}
}
}
}
这个我写了两个页面,第一个登录注册页,登录成功后进入第二个页面,退出当前账户就是回到也页面一!!!全部代码就是这些咯。最后再给大家看看具体效果!
今天的分享就到这儿咯!大家看完记得给个一键三连哇!!!!