1001-----homework------version third

 

  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() + "\n\r"        
101             + "姓名:" + getName() + "\n\r"
102             + "身份证号:" + getId() + "\n\r"
103             + "银行卡号:" + getCardNumber() + "\n\r"
104             + "密码:"  + getPassword() + "\n\r"
105             + "余额:" + getBalance();
106     }
107 }

 

posted @ 2016-10-11 16:08  火山林风  阅读(280)  评论(0编辑  收藏  举报