

1 package com.kai.li.message;
2
3 import com.kai.li.abc.ATMABC;
4
5 /**
6 *本类定义所有界面输出内容
7 *分为6个内部类
8 *依次是主界面,开户界面,查询界面,存款界面,取款界面,退出界面
9 */
10 public class ShowView{
11 public static class Main{
12 public static void display(){
13 System.out.println("银行自助终端系统");
14 System.out.println("****************************");
15 System.out.println("0.------开户");
16 System.out.println("1.------查询");
17 System.out.println("2.------存款");
18 System.out.println("3.------取款");
19 System.out.println("4.------退出");
20 System.out.println("****************************");
21 }
22 public static void showSelect(){
23 System.out.println("请选择你要执行的功能:");
24 }
25 public static void showReset(){
26 System.out.println("您选择的菜单不存在");
27 System.out.println("请重新选择:");
28 showSelect();
29 }
30 }
31 public static class OpenAccount{
32 public static void display(){
33 System.out.println("****************************");
34 System.out.println("您选择的为开户功能");
35 showInputName();
36 }
37 public static void showInputName(){
38 System.out.println("请输入您的姓名:");
39 }
40 public static void showInputId(){
41 System.out.println("请输入您的身份证号:");
42 }
43 public static void showResetId(){
44 System.out.println("您输入的身份证号格式不正确,请重新输入");
45 showInputId();
46 }
47 public static void showInputPassword(){
48 System.out.println("请输入您的密码:");
49 }
50 public static void showResetPassword(){
51 System.out.println("您输入的密码格式不正确,请重新输入");
52 showInputPassword();
53 }
54 public static void showSuccess(){
55 System.out.println("开户成功,谢谢使用!");
56 }
57 }
58 public static class Query{
59 public static void display(){
60 System.out.println("****************************");
61 System.out.println("您选择的为查询功能");
62 showQueryCardNumber();
63 }
64 public static void showQueryCardNumber(){
65 System.out.println("请输入您要查询的卡号:");
66 }
67 public static void showResetCardNumber(){
68 System.out.println("您输入的卡号不存在,请重新输入");
69 showQueryCardNumber();
70 }
71 public static void showInputPassword(){
72 System.out.println("请输入您的密码:");
73 }
74 public static void showResetPassword(){
75 System.out.println("您输入的密码格式不正确,请重新输入");
76 showInputPassword();
77 }
78 public static void showCardInfo(){
79 System.out.println("您查询的账号信息为:");
80 System.out.println("****************************");
81 }
82 public static void showCardMessage(ATMABC atmABC){
83 System.out.println(atmABC.card);
84 System.out.println("友情提示:您的账户余额为"+atmABC.checkBalance()+"元");
85 }
86 }
87 public static class Deposit{
88 public static void display(){
89 System.out.println("****************************");
90 System.out.println("您选择的为存款功能");
91 showDepositCardNumber();
92 }
93 public static void showDepositCardNumber(){
94 System.out.println("请输入您要存款的卡号:");
95 }
96 public static void showResetCardNumber(){
97 System.out.println("您输入的卡号不存在,请重新输入");
98 showDepositCardNumber();
99 }
100 public static void showInputPassword(){
101 System.out.println("请输入您的密码:");
102 }
103 public static void showResetPassword(){
104 System.out.println("您输入的密码格式不正确,请重新输入");
105 showInputPassword();
106 }
107 public static void showCardInfo(){
108 System.out.println("您要存款的账号信息为:");
109 System.out.println("****************************");
110 }
111 public static void showDepositMoney(){
112 System.out.println("请输入您要存款的金额:");
113 }
114 public static void showError(){
115 System.out.println("您输入的金额无效,系统将自动进入主界面");
116 }
117 public static void showSuccess(){
118 System.out.println("存款成功,谢谢使用!");
119 }
120 }
121 public static class Withdrawal{
122 public static void display(){
123 System.out.println("****************************");
124 System.out.println("您选择的为取款功能");
125 showWithdrawalCardNumber();
126 }
127 public static void showWithdrawalCardNumber(){
128 System.out.println("请输入您要取款的卡号:");
129 }
130 public static void showResetCardNumber(){
131 System.out.println("您输入的卡号不存在,请重新输入");
132 showWithdrawalCardNumber();
133 }
134 public static void showInputPassword(){
135 System.out.println("请输入您的密码:");
136 }
137 public static void showResetPassword(){
138 System.out.println("您输入的密码格式不正确,请重新输入");
139 showInputPassword();
140 }
141 public static void showCardInfo(){
142 System.out.println("您要取款的账号信息为:");
143 System.out.println("****************************");
144 }
145 public static void showWithdrawalMoney(){
146 System.out.println("请输入您要取款的金额:");
147 }
148 public static void showError(){
149 System.out.println("您输入的金额无效,系统将自动进入主界面");
150 }
151 public static void showSuccess(){
152 System.out.println("取款成功,谢谢使用!");
153 }
154 }
155 public static class Exit{
156 public static void exit(){
157 System.out.println("系统已成功推出,谢谢使用!");
158 }
159 }
160 }
1 package com.kai.li.myutils;
2
3 /**
4 *本类为检查用户输入的数据是否合法的类
5 *可以检查的内容为:
6 *身份证号,密码,卡号,金额
7 */
8 public class Check{
9
10 public static boolean checkId(String id){ //检测输入身份证合法性
11 if(id.length()==18 && id.matches("[0-9]+"))
12 return true;
13 return false;
14 }
15 public static boolean checkPassword(String password){ //检测输入密码合法性
16 if(password.trim().length()==6)
17 return true;
18 return false;
19 }
20 public static boolean checkCardNumber(String cardNumber){ //检测输入卡号合法性
21 if(cardNumber.length()==8 && cardNumber.matches("[0-9]+"))
22 return true;
23 return false;
24 }
25
26 public static boolean checkMoney(String money){ //检测输入金额合法性
27 if(money.matches("^[0-9]+(.[0-9]+)") && Double.parseDouble(money.trim())>=0)
28 return true;
29 return false;
30 }
31 }
1 package com.kai.li.myutils;
2
3 import java.util.Scanner;
4
5 /**
6 *用户输入类
7 *用来接收用户的各种输入值
8 *包括界面选择的数值,姓名,身份证号,密码,金额,银行卡号
9 */
10 public class MyScanner{
11
12 @SuppressWarnings("resource")
13 public static String getValue(){ //获取用户输入值的通用方法
14 Scanner scanner = new Scanner(System.in);
15 String str = scanner.nextLine();
16 return str;
17 }
18 public static String getViewNumber(){ //获取用户输入的数值,用于选择需要进入的界面
19 return getValue();
20 }
21 public static String getName(){ //获取用户输入的姓名
22 return getValue();
23 }
24 public static String getId(){ //获取用户输入的身份证号
25 return getValue();
26 }
27 public static String getPassword(){ //获取用户输入的密码
28 return getValue();
29 }
30 public static String getMoney(){ //获取用户输入的金额
31 return getValue();
32 }
33 public static String getCardNumber(){ //获取用户输入的银行卡号
34 return getValue();
35 }
36
37 }
1 package com.kai.li.myutils;
2
3 import java.util.ArrayList;
4 import java.util.List;
5 import java.util.Random;
6 import java.io.File;
7 import java.io.InputStream;
8 import java.io.OutputStream;
9 import java.io.FileInputStream;
10 import java.io.FileOutputStream;
11 import java.io.ObjectOutputStream;
12 import java.io.ObjectInputStream;
13 import java.io.IOException;
14 import com.kai.li.abc.DepositCard;
15
16 /**
17 *define functions myself
18 *@author caw lid
19 */
20 public class MyUtils{
21
22 /*read string from file contents*/
23 public static String readFileContents(String filename)throws IOException{
24 File file = new File(filename);
25 InputStream in = new FileInputStream(file);
26 int i = -1;
27 byte[] str = new byte[1024];
28 String strs = "";
29 while((i = in.read(str)) != -1){
30 strs = new String(str,0,i);
31 }
32 in.close();
33 return strs;
34 }
35
36 /*write string to a file*/
37 public static void writeToFile(String filename,String contents)throws IOException{
38 File file = new File(filename);
39 if(!file.exists())
40 file.createNewFile();
41 OutputStream out = new FileOutputStream(file,true);
42 String str = contents;
43 out.write(str.getBytes());
44 out.close();
45 }
46
47 /*read an object from a textfile*/
48 @SuppressWarnings("unchecked")
49 public static List<DepositCard> readObject(String filename)throws Exception{
50 File file = new File(filename);
51 List<DepositCard> listCard = new ArrayList<>();
52 if(file.exists()){
53 ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
54 listCard = (List<DepositCard>)ois.readObject();
55 ois.close();
56 return listCard;
57 }
58 return null;
59 }
60
61 /*write an object to a textfile*/
62 public static void writeObject(String filename,List<DepositCard> card)throws IOException{
63 File file = new File(filename);
64 if(!file.exists())
65 file.createNewFile();
66 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
67 oos.writeObject(card);
68 oos.close();
69 }
70
71 /*get a number as String and assign the length*/
72 public static String getStringNumber(int length){
73 String str = "";
74 Random random = new Random();
75 for(int i = 0;i < length;i ++){
76 int num = random.nextInt(10);
77 str +=num;
78 }
79 return str;
80 }
81 }
1 package com.kai.li.model;
2
3 import com.kai.li.abc.ATMABC;
4 import com.kai.li.view.DepositView;
5 import com.kai.li.view.MainView;
6 import com.kai.li.view.OpenAccountView;
7 import com.kai.li.view.QueryView;
8 import com.kai.li.message.ShowView;
9 import com.kai.li.view.WithdrawalView;
10
11 /**
12 *主界面控制器类
13 *接收用户输入数值
14 *根据用户输入,判断需要启动的相应界面视图
15 */
16 public class MainModel{
17
18 ATMABC atmABC;
19
20 public MainModel(ATMABC atmABC){
21 this.atmABC = atmABC;
22 }
23
24 /*方法实现区*/
25 /*根据用户输入,选择进入相应界面视图*/
26 public void selectView(String number){ //传入用户输入的命令参数
27 switch(number){ //switch接收传入参数
28 case "0":
29 new OpenAccountView(atmABC); //选择0时,实例化开户界面对象,进入开户界面
30 break;
31 case "1":
32 new QueryView(atmABC); //选择1时,实例化查询界面对象,进入查询界面
33 break;
34 case "2":
35 new DepositView(atmABC); //选择2时,实例化存款界面对象,进入存款界面
36 break;
37 case "3":
38 new WithdrawalView(atmABC); //选择3时,实例化取款界面对象,进入取款界面
39 break;
40 case "4":
41 ShowView.Exit.exit(); //选择4时,显示退出提示信息
42 System.exit(1); //退出系统
43 break;
44 default:
45 ShowView.Main.showReset(); //输入不合法时,显示输入不正确的提示信息
46 new MainView(atmABC); //实例化主界面对象,重新启动主界面视图
47 break;
48 }
49 }
50 }
1 package com.kai.li.model;
2
3 import static com.kai.li.myutils.MyUtils.readObject;
4 import static com.kai.li.myutils.MyUtils.writeObject;
5 import java.io.File;
6 import java.util.List;
7 import com.kai.li.abc.DepositCard;
8 import com.kai.li.view.MainView;
9 import com.kai.li.abc.ATMABC;
10 import com.kai.li.message.ShowView.Query;
11
12 /**
13 *本类为开户控制器类
14 *本类功能为保存视图类接收的用户输入数据
15 *将数据保存到card变量
16 *将card变量添加到abcbank的集合中去
17 *给通用模型的方法传递数据让其保存到文件
18 */
19 public class CommonModel{
20
21 /*成员属性定义区*/
22 ATMABC atmABC; //定义ATM机对象
23 String filename;
24
25 /*构造方法区*/
26 /*无参构造方法*/
27 public CommonModel(ATMABC atmABC){
28 initialize(atmABC); //初始化成员变量
29 //从文件读取读取农业银行的所有账户信息到ATM机的成员属性
30 readInfoFromFile(filename);
31 }
32
33 /*方法实现区*/
34
35 /*初始化成员变量*/
36 public void initialize(ATMABC atmABC){
37 this.atmABC = atmABC; //传入ATM机对象赋值
38 filename = "d:"+File.separator+"abcdepositcard.txt";
39 }
40
41 /*开户相关方法区*/
42 /*保存姓名到card对象中*/
43 public void saveName(String name){ //传递姓名参数
44 atmABC.card.setName(name); //调用card的方法保存姓名
45 }
46 /*保存身份证号到card对象中*/
47 public void saveId(String id){ //传递身份证号参数
48 atmABC.card.setId(id); //调用card的方法保存身份证号
49 }
50 /*保存密码到card对象中*/
51 public void savePassword(String password){ //传递密码参数
52 atmABC.card.setPassword(password); //调用card的方法保存密码
53 }
54 /*开户并保存数据到文件*/
55 public void openAccount(){
56 //调用ATM机方法进行开户
57 atmABC.openAccount(atmABC.card.getName(),atmABC.card.getId(),atmABC.card.getPassword());
58 //重新初始化用于保存临时储蓄卡账户的变量card
59 atmABC.card = new DepositCard();
60 //调用自身的方法将数据写入文件
61 saveToFile(filename,atmABC.getListCard());
62 }
63
64 /*检查卡号密码,输出账号信息共3个方法*/
65 /*检查卡号是否存在*/
66 public boolean checkCardNumber(String cardNumber){
67 for(DepositCard depositCard:atmABC.getListCard()){
68 if(cardNumber.equals(depositCard.getCardNumber())){
69 atmABC.card = depositCard;
70 return true;
71 }
72 }
73 return false;
74 }
75 /*检查密码是否正确*/
76 public boolean checkPassword(String password){
77 if(password.equals(atmABC.card.getPassword()))
78 return true;
79 return false;
80 }
81 /*输出账户信息,atm中的card以及card余额单独显示的信息*/
82 public void showCardInfo(){
83 Query.showCardMessage(this.atmABC);
84 }
85
86 /*存款,取款方法*/
87 /*存款方法*/
88 public void deposit(double money){
89 for(DepositCard depositCard:atmABC.getBank().getListCard()){
90 if(atmABC.card.equals(depositCard)){
91 atmABC.deposit(money);
92 depositCard = atmABC.card;
93 break;
94 }
95 }
96 //调用通用模型类的方法将数据写入文件
97 saveToFile(filename,atmABC.getListCard());
98 new MainView(atmABC);
99 }
100 /*取款方法*/
101 public void withdrawal(double money){
102 for(DepositCard depositCard:atmABC.getListCard()){
103 if(atmABC.card.equals(depositCard)){
104 atmABC.withdrawal(money);
105 depositCard = atmABC.card;
106 break;
107 }
108 }
109 //调用通用模型类的方法将数据写入文件
110 saveToFile(filename,atmABC.getListCard());
111 new MainView(atmABC);
112 }
113
114 /*保存,读取文件数据,共3个方法*/
115 /*保存数据到文件,覆盖而不追加*/
116 public void saveToFile(String filename,List<DepositCard> listCard){
117 try{
118 writeObject(filename,listCard);
119 }catch(Exception e){
120 e.printStackTrace();
121 }
122 }
123 /*读取文件内容到指定容器listCard*/
124 public void readInfoFromFile(String filename){
125 try{
126 atmABC.getBank().setListCard(readObject(filename));
127 }catch(Exception e){
128 e.printStackTrace();
129 }
130 }
131 }
1 package com.kai.li.client;
2
3 import com.kai.li.abc.ATMABC;
4 import com.kai.li.view.MainView;
5
6 /**
7 *定义客户端的类
8 *本类功能为启动主界面
9 */
10 public class Client{
11 public static void main(String[] args){ //main方法,程序入口,实例化一个农业银行的ATM对象,
12 ATMABC atmABC = new ATMABC(); //为保证始终一台ATM机,需要进行参数传递
13 new MainView(atmABC); //启动ATM机的主界面视图
14 }
15 }
1 package com.kai.li.view;
2
3 import static com.kai.li.myutils.MyScanner.*;
4 import com.kai.li.abc.ATMABC;
5 import com.kai.li.message.ShowView;
6 import com.kai.li.model.MainModel;
7
8 /**
9 *本类为主界面视图类
10 *本类传入主界面控制器对象
11 *本类功能为:界面视图的输出,用户输入,根据用户选择调用控制器的方法进入相应界面
12 */
13 public class MainView{
14
15 /*构造方法区*/
16 /*无参构造方法*/
17 public MainView(ATMABC atmABC){
18 this.display() //显示主界面并给出提示
19 .selectView(getViewNumber(),new MainModel(atmABC)); //进入用户选择的视图界面
20 }
21
22 /*方法实现区*/
23 /*选择视图界面的方法,需要传入两个参数,一个是用户输入的选择命令,一个是主界面控制器对象*/
24 public MainView selectView(String number,MainModel mainController){
25 mainController.selectView(number); //调用主界面控制器对象的视图界面选择方法
26 return this;
27 }
28 /*显示主界面视图的方法*/
29 public MainView display(){
30 ShowView.Main.display(); //显示本界面的主视图
31 ShowView.Main.showSelect(); //显示让用户输入命令的提示信息
32 return this;
33 }
34 }
1 package com.kai.li.view;
2
3
4 /*initialize(atmABC); //初始化成员属性
5
6 display(); //显示本界面的主视图并提示用户输入姓名
7
8 checkName(getName()); //根据用户输入的姓名给出相应提示
9
10 checkId(getId()); //根据用户输入的身份证号给出相应提示
11
12 checkPassword(getPassword());*/ //根据用户输入的密码给出相应提示
13
14 import static com.kai.li.myutils.MyScanner.*;
15 import com.kai.li.abc.ATMABC;
16 import com.kai.li.model.CommonModel;
17 import com.kai.li.myutils.Check;
18 import static com.kai.li.message.ShowView.*;
19
20 /**
21 *本类为开户界面类
22 *本类持有一个对象变量,为通用控制器类的实例对象
23 *本类通过调用Check类进行数值合法性判断
24 *本类功能有四个
25 *1 输出界面信息
26 *2 接收用户输入的数据
27 *3 根据接收数据给出相应提示
28 *4 将合法数值传递给控制器类中的方法进行保存
29 */
30 /***
31 *
32 * @author Administrator
33 *
34 */
35 public class OpenAccountView{
36
37 /*成员属性定义区*/
38 CommonModel commonController; //定义通用控制器类
39 ATMABC atmABC; //定义ATM机对象
40
41 /*构造方法区*/
42 /*无参构造方法*/
43 /***
44 *
45 * @param atmABC
46 */
47 public OpenAccountView(ATMABC atmABC){
48
49 this.initialize(atmABC) //初始化成员属性
50 .display() //显示本界面的主视图并提示用户输入姓名
51 .checkName(getName()) //根据用户输入的姓名给出相应提示
52 .checkId(getId()) //根据用户输入的身份证号给出相应提示
53 .checkPassword(getPassword()); //根据用户输入的密码给出相应提示
54 }
55
56 /*方法实现区*/
57 /*初始化成员变量*/
58 public OpenAccountView initialize(ATMABC atmABC){
59 commonController = new CommonModel(atmABC); //初始化开户控制器对象
60 this.atmABC = atmABC; //传入ATM机对象赋值
61 return this;
62 }
63 /*显示视图*/
64 public OpenAccountView display(){
65 OpenAccount.display(); //显示本界面的主视图并提示用户输入姓名
66 return this;
67 }
68 /*根据用户输入姓名给出相应提示*/
69 public OpenAccountView checkName(String name){ //接收用户输入姓名参数
70 commonController.saveName(name); //调用控制器方法保存姓名信息
71 OpenAccount.showInputId(); //提示用户输入身份证号
72 return this;
73 }
74 /*根据用户输入身份证号给出相应提示*/
75 public OpenAccountView checkId(String id){ //接收用户输入身份证号
76 if(!Check.checkId(id)){ //检查用户输入的身份证号合法性
77 OpenAccount.showResetId(); //不合法时输出格式不正确的提示信息
78 checkId(getId()); //不合法时递归调用自身,重新验证用户身份证号输入
79 }else{
80 OpenAccount.showInputPassword(); //合法时提示用户输入密码
81 commonController.saveId(id); //合法时调用控制器方法保存用户身份证号
82 }
83 return this;
84 }
85 /*根据用户输入密码给出相应提示*/
86 public OpenAccountView checkPassword(String password){ //接收用户输入密码
87 if(!Check.checkPassword(password)){ //检查用户输入密码的合法性
88 OpenAccount.showResetPassword(); //不合法时输出格式不正确的提示信息
89 checkPassword(getPassword()); //不合法时递归调用自身,重新验证用户密码输入
90 }else{
91 OpenAccount.showSuccess(); //合法时输出开户成功信息的提示
92 commonController.savePassword(password); //合法时调用控制器方法保存用户密码
93 commonController.openAccount(); //合法时通知控制器开户并将数据进行保存
94 new MainView(atmABC); //合法时实例化主界面对象回到主界面
95 }
96 return this;
97 }
98 }
1 package com.kai.li.view;
2
3 import static com.kai.li.myutils.MyScanner.*;
4 import com.kai.li.myutils.Check;
5 import com.kai.li.abc.ATMABC;
6 import com.kai.li.message.ShowView;
7 import com.kai.li.model.CommonModel;
8
9 /*****/
10 public class QueryView{
11
12 ATMABC atmABC;
13 CommonModel commonController;
14
15 public QueryView(ATMABC atmABC){
16
17 this.initialize(atmABC) //初始化成员变量
18 .display() //显示本界面的主视图并提示用户输入卡号
19 .checkCardNumber(getCardNumber()) //根据用户输入的卡号给出相应提示
20 .checkPassword(getPassword()); //根据用户输入密码给出相应提示
21 }
22
23 public QueryView initialize(ATMABC atmABC){
24 this.atmABC = atmABC; //实例化同一台ATM机对象
25 commonController = new CommonModel(atmABC); //实例化控制器对象
26 return this;
27 }
28 public QueryView display(){
29 ShowView.Query.display(); //显示本界面的主视图并提示用户输入卡号
30 return this;
31 }
32 public QueryView checkCardNumber(String cardNumber){
33 if(!Check.checkCardNumber(cardNumber) ||
34 !commonController.checkCardNumber(cardNumber)){
35 ShowView.Query.showResetCardNumber();
36 checkCardNumber(getCardNumber());
37 }else{
38 ShowView.Query.showInputPassword();
39 }
40 return this;
41 }
42 public QueryView checkPassword(String password){
43 if(!Check.checkPassword(password) ||
44 !commonController.checkPassword(password)){
45 ShowView.Query.showResetPassword();
46 checkPassword(getPassword());
47 }else{
48 ShowView.Query.showCardInfo();
49 commonController.showCardInfo();
50 new MainView(atmABC);
51 }
52 return this;
53 }
54 }
1 package com.kai.li.view;
2
3 import static com.kai.li.myutils.MyScanner.*;
4 import com.kai.li.abc.ATMABC;
5 import com.kai.li.message.ShowView;
6 import com.kai.li.model.CommonModel;
7 import com.kai.li.myutils.Check;
8
9 /*****/
10 public class DepositView{
11
12 ATMABC atmABC;
13 CommonModel commonController;
14
15 public DepositView(ATMABC atmABC){
16
17 this.initialize(atmABC)
18 .display()
19 .checkCardNumber(getCardNumber())
20 .checkPassword(getPassword())
21 .checkMoney(getMoney());
22 }
23
24 public DepositView initialize(ATMABC atmABC){
25 this.atmABC = atmABC;
26 commonController = new CommonModel(atmABC);
27 return this;
28 }
29 public DepositView display(){
30 ShowView.Deposit.display();
31 return this;
32 }
33 public DepositView checkCardNumber(String cardNumber){
34 if(!Check.checkCardNumber(cardNumber) ||
35 !commonController.checkCardNumber(cardNumber)){
36 ShowView.Deposit.showResetCardNumber();
37 checkCardNumber(getCardNumber());
38 }else{
39 ShowView.Deposit.showInputPassword();
40 }
41 return this;
42 }
43 public DepositView checkPassword(String password){
44 if(!Check.checkPassword(password) ||
45 !commonController.checkPassword(password)){
46 ShowView.Deposit.showResetPassword();
47 checkPassword(getPassword());
48 }else{
49 ShowView.Deposit.showCardInfo();
50 commonController.showCardInfo();
51 ShowView.Deposit.showDepositMoney();
52 }
53 return this;
54 }
55 public DepositView checkMoney(String money){
56 if(!Check.checkMoney(money)){
57 ShowView.Deposit.showError();
58 checkMoney(getMoney());
59 }else{
60 ShowView.Deposit.showSuccess();
61 commonController.deposit(Double.parseDouble(money.trim()));
62 new MainView(atmABC);
63 }
64 return this;
65 }
66 }
1 package com.kai.li.view;
2
3 import com.kai.li.myutils.Check;
4 import static com.kai.li.myutils.MyScanner.*;
5 import com.kai.li.abc.ATMABC;
6 import com.kai.li.message.ShowView;
7 import com.kai.li.model.CommonModel;
8
9 /****/
10 public class WithdrawalView{
11
12 ATMABC atmABC;
13 CommonModel commonController;
14
15 public WithdrawalView(ATMABC atmABC){
16
17 this.initialize(atmABC)
18 .display()
19 .checkCardNumber(getCardNumber())
20 .checkPassword(getPassword())
21 .checkMoney(getMoney());
22 }
23
24 public WithdrawalView initialize(ATMABC atmABC){
25 this.atmABC = atmABC;
26 commonController = new CommonModel(atmABC);
27 return this;
28 }
29 public WithdrawalView display(){
30 ShowView.Withdrawal.display();
31 return this;
32 }
33 public WithdrawalView checkCardNumber(String cardNumber){
34 if(!Check.checkCardNumber(cardNumber) ||
35 !commonController.checkCardNumber(cardNumber)){
36 ShowView.Withdrawal.showResetCardNumber();
37 checkCardNumber(getCardNumber());
38 }else{
39 ShowView.Withdrawal.showInputPassword();
40 }
41 return this;
42 }
43 public WithdrawalView checkPassword(String password){
44 if(!Check.checkPassword(password) ||
45 !commonController.checkPassword(password)){
46 ShowView.Withdrawal.showResetPassword();
47 checkPassword(getPassword());
48 }else{
49 ShowView.Withdrawal.showCardInfo();
50 commonController.showCardInfo();
51 ShowView.Withdrawal.showWithdrawalMoney();
52 }
53 return this;
54 }
55 public WithdrawalView checkMoney(String money){
56 if(!Check.checkMoney(money)){
57 ShowView.Withdrawal.showError();
58 checkMoney(getMoney());
59 }else{
60 ShowView.Withdrawal.showSuccess();
61 commonController.withdrawal(Double.parseDouble(money.trim()));
62 new MainView(atmABC);
63 }
64 return this;
65 }
66 }
1 package com.kai.li.unionpay;
2
3 import com.kai.li.abc.DepositCard;
4
5 /**
6 *定义ATM机的抽象类
7 *该类持有储蓄卡对象
8 *调用储蓄卡对象的方法实现了自身的查询余额,存款,取款方法
9 *该类定义了自己的抽象方法---开户
10 */
11 public abstract class AATM{
12
13 public DepositCard card;
14
15 /*定义抽象方法---开户,具体实现由子类完成*/
16 //抽象方法:定义开户功能
17 public abstract boolean openAccount(String name,String id,String password);
18
19 /*调用银行卡的查询余额方法,实现ATM机自身的查询余额方法*/
20 public double checkBalance(){ //方法:实现查询余额功能
21 return card.getBalance(); //调用card对象的查询余额方法
22 }
23
24 /*调用银行卡的存款方法,实现ATM机自身的存款方法*/
25 public boolean deposit(double money){ //方法:实现存款功能
26 return card.deposit(money); //调用card对象的存款方法
27
28 }
29
30 /*调用银行卡的取款方法,实现ATM机自身的取款方法*/
31 public boolean withdrawal(double money){ //方法:实现取款功能
32 return card.withdrawal(money); //调用card对象的取款方法
33 }
34 }
1 package com.kai.li.unionpay;
2
3 /**
4 *这是一个枚举类
5 *该枚举类定义了四大行
6 *需使用构造方法给四大行指定具体名称
7 */
8 public enum EBank{
9
10 /*通过构造方法定义四大行的枚举常量*/
11 ABC("农业银行"),ICBC("工商银行"),CCB("建设银行"),BOC("中国银行");
12
13 /*构造方法,可设置枚举常量的name属性*/
14 private EBank(String name){ //构造方法:初始化name的值
15 this.setName(name);
16 }
17
18 /*定义私有属性name,用来标识枚举常量*/
19 private String name; //属性:通过构造方法完成赋值
20
21 /*setter方法*/
22 public void setName(String name){ //方法:可设置name属性的值
23 this.name = name;
24 }
25
26 /*getter方法*/
27 public String getName(){ //方法:可获取name属性的值
28 return this.name;
29 }
30
31 }
1 package com.kai.li.unionpay;
2
3 /**
4 *定义银行卡接口
5 *该接口包含三个抽象方法
6 *1 查询余额
7 *2 存款
8 *3 取款
9 *@author
10 *@version second
11 */
12 public interface ICard{
13
14 /*查询余额的抽象方法,该方法应当返回余额的具体数值*/
15 double checkBalance();
16
17 /*存款的抽象方法,该方法应当返回一个布尔值,成功为true,失败为false*/
18 boolean deposit(double money);
19
20 /*取款的抽象方法,该方法应当返回一个布尔值,成功为true,失败为false*/
21 boolean withdrawal(double money);
22
23 }
1 package com.kai.li.abc;
2
3 import com.kai.li.unionpay.EBank;
4 import com.kai.li.unionpay.AATM;
5 import static com.kai.li.myutils.MyUtils.getStringNumber;
6
7 import java.util.List;
8
9 /**
10 *ATM机的实现类
11 *本类为农业银行的ATM机类
12 *本类继承自父类的方法有三个
13 *三个方法是:查询余额,存款,取款
14 *本类实现父类的抽象方法有一个
15 *实现的抽象方法是:开户
16 *本类成员属性有:银行类型
17 *成员属性银行类型使用枚举类赋值
18 */
19 public class ATMABC extends AATM{
20
21 /**成员变量定义区**/
22 private EBank type; //成员属性:定义发卡行名称
23 private BankABC bank; //成员属性:定义农业银行对象
24
25 /**构造方法定义区**/
26 /*无参构造方法*/
27 public ATMABC(){
28 this.card = new DepositCard(); //初始化:父类继承过来的储蓄卡对象
29 this.type = EBank.ABC; //初始化:枚举类给发卡行名称赋值
30 this.bank = BankABC.getBankABC(); //初始化:单例模式初始化银行对象
31 }
32
33 /**Override方法区**/
34 @Override
35 /*重写父类抽象方法实现开户功能*/
36 public boolean openAccount(String name,String id,String password){
37 card = new DepositCard(name,id,password); //根据传入参数实例化储蓄卡对象
38 card.setType(this.type); //给储蓄卡对象设置发卡行
39 card.setCardNumber(getStringNumber(8)); //给储蓄卡对象随机生成8位数卡号
40 for(DepositCard card:bank.getListCard()){ //循环遍历农业银行所有的已开户账户
41 if(this.card.equals(card)) //判断新生成储蓄卡对象是否在农业银行账户集合中存在
42 return false; //如果存在,返回false
43 }
44 bank.getListCard().add(card); //如果不存在,则将新开户账户加入到农业银行账户集合
45 return true; //并且返回true
46 }
47
48 /*getter方法区*/
49 public BankABC getBank(){ //获取农业银行的对象
50 return bank;
51 }
52 public EBank getType(){ //获取ATM机的银行类型属性
53 return type;
54 }
55 public List<DepositCard> getListCard(){ //获取农业银行账户集合
56 return bank.getListCard();
57 }
58 }
1 package com.kai.li.abc;
2
3 import java.util.List;
4 import java.util.ArrayList;
5 import com.kai.li.unionpay.EBank;
6
7 /**
8 *定义农业银行的类
9 *该类构造方法私有,使用单例模式定义
10 *属性包括银行类型,银行名称,银行卡列表
11 *其中银行类型以枚举定义,银行名称使用枚举类的name属性赋值
12 *银行卡使用集合list保存
13 *本类不设置setter方法
14 */
15 public class BankABC{
16
17 /**
18 *变量定义区
19 *定义了自身实例变量bank并设置为私有静态常量
20 *@see type 定义了枚举类型的变量type,用来保存银行类型
21 *@see name 定义了变量name,用来保存该类型银行的名称
22 *@see listCard 定义了变量集合listCard,用来保存开户的银行卡
23 */
24 private static final BankABC bank = new BankABC(); //定义自身对象的唯一实例
25
26 private EBank type; //定义银行类型
27 private String name; //定义银行名称
28 private List<DepositCard> listCard; //定义保存银行卡账户集合
29
30 public void setListCard(List<DepositCard> listCard) {
31 this.listCard = listCard;
32 }
33
34 /*私有化的构造方法*/
35 private BankABC(){
36 type = EBank.ABC; //使用枚举类型初始化银行类型
37 name = type.getName(); //使用枚举类型的属性初始化银行名称
38 listCard = new ArrayList<DepositCard>(); //使用List接口的实现类ArrayList初始化银行卡账户集合
39 }
40
41 /*getter方法区*/
42 public static BankABC getBankABC(){ //定义静态工厂方法取得自身实例
43 return bank;
44 }
45 public EBank getEBank(){ //获取私有属性银行类型的值
46 return type;
47 }
48 public String getName(){ //获取私有属性银行名称的值
49 return name;
50 }
51 public List<DepositCard> getListCard(){ //获取私有属性银行卡账户集合的值
52 return listCard;
53 }
54 }
1 package com.kai.li.abc;
2
3 import java.io.Serializable;
4 import com.kai.li.unionpay.EBank;
5 import com.kai.li.unionpay.ICard;
6
7 /**
8 *储蓄卡类
9 *该类继承自ICard接口
10 *该类拥有属性银行类型,姓名,身份证号,卡号,密码,余额
11 *该类实现接口中的三个方法,查询余额,存款,取款
12 *银行卡类型将由ATM机所属银行设置
13 */
14 public class DepositCard implements ICard,Serializable{
15
16 /**
17 *
18 */
19 private static final long serialVersionUID = 1L;//软件提示加的,等下查查什么意思
20 /*变量定义区*/
21 private EBank type; //变量:定义发卡行
22 private String name; //变量:定义储蓄卡持有人姓名
23 private String id; //变量:定义身份证号
24 private String cardNumber; //变量:定义卡号
25 private String password; //变量:定义密码
26 private double balance; //变量:定义余额
27
28 /*构造方法区*/
29 public DepositCard(){ //构造方法:无参构造方法
30 this.type = null; //初始化:给发卡行赋值null
31 this.cardNumber = null; //初始化:给卡号赋值null
32 this.balance = 0.0; //初始化:给余额赋值0.0元
33 }
34 public DepositCard(String name,String id,String password){ //构造方法:三个参数的构造方法
35 this(); //调用:调用本类无参构造方法初始化成员变量
36 this.name = name; //初始化:将构造方法接收的参数给name赋值
37 this.id = id; //初始化:将构造方法接收的参数给id赋值
38 this.password = password; //初始化:将构造方法接收的参数给password赋值
39 }
40
41 /*setter方法区*/
42 public void setType(EBank type){ //setter:设置发卡行
43 this.type = type;
44 }
45 public void setName(String name){ //setter:设置姓名
46 this.name = name;
47 }
48 public void setId(String id){ //setter:设置身份证号
49 this.id = id;
50 }
51 public void setCardNumber(String cardNumber){ //setter:设置卡号
52 this.cardNumber = cardNumber;
53 }
54 public void setPassword(String password){ //setter:设置密码
55 this.password = password;
56 }
57 public void setBalance(double balance){ //setter:设置余额
58 this.balance = balance;
59 }
60
61 /*getter方法区*/
62 public EBank getType(){ //getter:获取发卡行
63 return type;
64 }
65 public String getName(){ //getter:获取持卡人姓名
66 return name;
67 }
68 public String getId(){ //getter:获取身份证号
69 return id;
70 }
71 public String getCardNumber(){ //getter:获取卡号
72 return cardNumber;
73 }
74 public String getPassword(){ //getter:获取密码
75 return password;
76 }
77 public double getBalance(){ //getter:获取余额
78 return balance;
79 }
80
81 /*重写方法区*/
82 @Override
83 public double checkBalance(){ //Override:查询余额
84 return this.getBalance(); //return:调用getter方法返回成员属性balance
85 }
86 @Override
87 public boolean deposit(double money){ //Override:存款
88 this.balance += money; //赋值:将传入的money参数与balance相加后赋值
89 return true; //return:存款成功返回true;
90 }
91 @Override
92 public boolean withdrawal(double money){ //Override:取款
93 if(money>this.balance) //判断传入的money是否合法
94 return false; //return:不合法返回false
95 this.balance -= money; //赋值:将传入的money参数与balance预算后赋值
96 return true; //return:取款成功返回true
97 }
98 @Override
99 public String toString(){ //Override:储蓄卡信息输出
100 return "发卡行:" + getType() + "
"
101 + "姓名:" + getName() + "
"
102 + "身份证号:" + getId() + "
"
103 + "银行卡号:" + getCardNumber() + "
"
104 + "密码:" + getPassword() + "
"
105 + "余额:" + getBalance();
106 }
107 }