嗖嗖移动大厅业务的整体架构思路和代码实现

整体架构思路:
分为6个功能区,使用switch case结构包围,分别是:
1.用户登录
2.用户注册
3.使用嗖嗖
4.话费充值
5.资费说明
6.退出系统

功能区模块:
1.用户登录:用if else结构整体判断是否存在该用户
如果存在:调用用户登录的方法:
此时有5个业务分支,用switch case结构:
1.本月账单查询
输出本月消费详细信息
2.套餐余量查询
分别判断用户属于三种套餐的哪一种,
然后输出套餐余量
3.打印消费详单
用到字符流写出的技能;
判断是否存在消费记录,如果不存在,则提示不存在此卡的消费记录;
如果存在,则利用Filewriter字符流写出记录,
4.套餐变更
判断用户是哪个套餐,如果是本套餐:
提示用户已经是本套餐,不需要换;
如果是其他套餐:
判断用户余额是否大于要换的套餐,如果余额不够,提示用户余额不足以支付新套餐的费用,让其充值,如果余额够,则用card.set属性接收新套餐。
5.办理退网
判断卡号是否存在,如果不存在,提示用户卡号不存在,不能退网!
如果存在使用remove()方法移除卡号

如果不存在:输入:对不起您输入的信息有误

2.用户注册
1.使用集合存放9个号码,通过下标定位用户选择的号码
根据需求,9个号码每行三列,用数组下标对3取余的方式 实现换行
2.选择套餐类型,三个类型,话痨,网虫,超人,(三个套餐各建一个类来实现具体方法)
3.输入用户名,密码,并接收
4.输入预存话费金额,此时要判断用户存的钱 是否小于月套餐资费,如果小于月套餐资费,提示用户预存的话费金额不足,让用户继续充值。
5.最后创建新卡,并提示用户卡号,用户名,当前余额等信息。


3.使用嗖嗖
也要先判断用户是否存在,存在的话,开始实现搜搜功能,此时利用生成随机数1-5,生成5个不同场景。

如果不存在 提示用户注册

4.话费充值

判断卡号是否存在,如果存在,开始充话费,此卡的金额信息 接收存入的金额,这里面可以细化,判断用户冲多少钱,如果小于50,提示用户重新充值,必须大于50元起充。
如果不存在,提示用户注册


5.资费说明 
此功能块,用到文档的读写相关技能,使用字符流FileReader读入资费说明的txt文档。


6.退出系统
输入“谢谢使用!”

  1 public class SosoMgr {
  2     Scanner input = new Scanner(System.in);
  3     CardUtil utils = new CardUtil();
  4     
  5     public static void main(String[] args) {
  6         SosoMgr soso = new SosoMgr();
  7         soso.mainMenu();
  8         System.out.println("谢谢使用!");
  9     }
 10 
 11     /**
 12      * 主流程
 13      */
 14     public void mainMenu() {
 15         int menuChoose = 0;
 16         String mobileNumber= "";
 17         String password = "";
 18         utils.init();
 19         utils.initScenes();
 20         //Common.typesInit();
 21         do {
 22             System.out.println("
*************欢迎使用嗖嗖移动业务大厅***************");
 23             System.out.println("1.用户登录   2.用户注册   3.使用嗖嗖   4.话费充值  5.资费说明  6.退出系统");
 24             System.out.print("请选择:");
 25             menuChoose = input.nextInt();
 26             // 分支语句:根据功能编号执行相应功能
 27             switch (menuChoose) {
 28             case 1:
 29                 //用户登录
 30                 System.out.print("请输入手机卡号:");
 31                 mobileNumber = input.next();
 32                 System.out.print("请输入密码:");
 33                 password = input.next();
 34                 if (utils.isExistCard(mobileNumber, password)) {
 35                     cardMenu(mobileNumber);
 36                 }else{
 37                     System.out.println("对不起,您输入的信息有误,无法登录!");
 38                 }
 39                 continue;
 40             case 2:
 41                 //用户注册
 42                 registCard();
 43                 continue;
 44             case 3:
 45                 //使用嗖嗖
 46                 System.out.print("请输入手机卡号:");
 47                 mobileNumber = input.next();                
 48                 if (utils.isExistCard(mobileNumber)) {
 49                     try {
 50                         utils.userSoso(mobileNumber);
 51                     } catch (Exception e) {
 52                         System.err.println(e.getMessage());
 53                     }
 54                 }else{
 55                     System.out.println("对不起,该卡号未注册,不能使用!");
 56                 }
 57                 continue;
 58             case 4:
 59                 //话费充值
 60                 System.out.print("请输入充值卡号:");
 61                 mobileNumber = input.next();
 62                 if (utils.isExistCard(mobileNumber)) {
 63                 System.out.print("请输入充值金额:");
 64                 double money = input.nextDouble();                
 65                 utils.chargeMoney(mobileNumber, money);
 66                 }else{
 67                     System.out.println("对不起,要充值的卡号未注册,无法充值!");
 68                 }
 69                 continue;                
 70             case 5:
 71                 //System.out.println("
*****资费说明******");
 72                 utils.showDescription();
 73                 continue;    
 74             case 6:
 75                 //退出系统
 76                 break;
 77             default:
 78                 //选择其他数字退出系统
 79                 break;
 80             }
 81             break;
 82         } while (true);
 83     }
 84 
 85     /**
 86      * 手机卡功能菜单
 87      */
 88     public int cardMenu(String mobileNumber) {
 89            int menuChoose = 0;
 90         do {
 91             System.out.println("
*****嗖嗖移动用户菜单*****");
 92             System.out.println("1.本月账单查询");
 93             System.out.println("2.套餐余量查询");
 94             System.out.println("3.打印消费详单");
 95             System.out.println("4.套餐变更");
 96             System.out.println("5.办理退网");
 97             System.out.print("请选择(输入1~5选择功能,其他键返回上一级):");
 98              menuChoose = input.nextInt();
 99             switch (menuChoose) {
100             case 1:
101                 System.out.println("
*****本月账单查询******");
102                 utils.showAmountDetail(mobileNumber);
103                 continue;
104             case 2:
105                 System.out.println("
*****套餐余量查询******");
106                 utils.showRemainDetail(mobileNumber);
107                 continue;
108             case 3:
109                 System.out.println("
*****消费详单查询******");
110                 utils.printConsumInfo(mobileNumber);
111                 continue;
112             case 4:
113                 System.out.println("
*****套餐变更******");
114                 System.out.print("1.话唠套餐  2.网虫套餐  3.超人套餐  请选择(序号):");                
115                 utils.changingPack(mobileNumber, input.nextInt());
116                 continue;
117             case 5:
118                 System.out.println("
*****办理退网******");
119                 utils.delCard(mobileNumber);
120                 System.out.println("谢谢使用!");
121                 System.exit(1);     //办理退网后退出系统    
122                         
123             }
124             
125             break;
126         } while (true);
127         return menuChoose;
128     }
129     
130     /**
131      * 注册新卡流程
132      */
133     public void registCard(){
134         //1.获取卡号信息集合
135         String[] newNumbers = utils.getNewNumbers(9);
136         
137         //2.(每行三列)显示可供选择的手机号列表
138         System.out.println("*****可选择的卡号*****");
139         for(int i=0;i<9;i++){
140             System.out.print((i+1)+"."+newNumbers[i]+"		");
141             if((i+1)%3==0){
142                 System.out.println();
143             }
144         }
145         
146         //3.选择手机号
147         System.out.print("请选择卡号(输入1~9的序号):");        
148         String number = newNumbers[input.nextInt()-1];
149         
150         //4.选择套餐类型
151         System.out.print("1.话唠套餐  2.网虫套餐  3.超人套餐,  ");
152         System.out.print("请选择套餐(输入序号):");
153         ServicePackage pack = utils.createPack(input.nextInt());
154         
155         //5.输入用户名
156         System.out.print("请输入姓名:");
157         String name = input.next();
158         
159         //6.输入密码
160         System.out.print("请输入密码:");
161         String password = input.next();
162         
163         //7.输入预存话费金额
164         double money = 0;
165         System.out.print("请输入预存话费金额:");
166          money = input.nextDouble();
167         while(money<pack.getPrice()){
168             System.out.print("您预存的话费金额不足以支付本月固定套餐资费,请重新充值:");
169             money = input.nextDouble();
170         }
171                 
172         //8.创建新卡对象并添加一条数据
173         MobileCard newCard = new MobileCard(name,password,number,pack,pack.getPrice(),money-pack.getPrice());
174         utils.addCard(newCard);        
175     }
176 }
 1 public class Common {
 2     /**
 3      * double类型格式化
 4      */
 5     public static String dataFormat(double data) {
 6         DecimalFormat formatData = new DecimalFormat("#.0");
 7         return formatData.format(data);
 8     }
 9     
10     /**
11      * double类型两数相减
12      */
13     public static double sub(double num1,double num2){
14         return (num1*10-num2*10)/10;
15     }
16 }
1 public enum ConsumType {
2    TALK,SMS,NETWORK
3 }
 1 public class ConsumInfo {
 2     private String cardNumber;  //卡号
 3     private String type;  //消费类型:通话、发短信、上网
 4     private int consumData;   //消费数据   通话:分钟   发短信:条   上网:MB
 5     
 6     public ConsumInfo(){}
 7     public ConsumInfo(String cardNumber, String type, int consumData) {
 8         super();
 9         this.cardNumber = cardNumber;
10         this.type = type;
11         this.consumData = consumData;
12     }
13     public String getCardNumber() {
14         return cardNumber;
15     }
16     public void setCardNumber(String cardNumber) {
17         this.cardNumber = cardNumber;
18     }
19     public String getType() {
20         return type;
21     }
22     public void setType(String type) {
23         this.type = type;
24     }
25     public int getConsumData() {
26         return consumData;
27     }
28     public void setConsumData(int consumData) {
29         this.consumData = consumData;
30     }    
31 }
  1 public class MobileCard {
  2     private String cardNumber;  //卡号
  3     private String userName;  //用户名
  4     private String passWord;  //密码    
  5     private ServicePackage serPackage;  //所属套餐
  6     private double consumAmount;  //当月消费金额
  7     private double money;  //账户余额
  8     private int realTalkTime;  //实际通话时长(分钟)
  9     private int realSMSCount;  //实际发送短信条数(条)
 10     private int realFlow;  //实际上网流量
 11     
 12     public MobileCard(){}
 13 
 14     public MobileCard(String userName, String passWord, String cardNumber,
 15             ServicePackage serPackage, double consumAmount, double money) {
 16         super();
 17         this.userName = userName;
 18         this.passWord = passWord;
 19         this.cardNumber = cardNumber;
 20         this.serPackage = serPackage;
 21         this.consumAmount = consumAmount;
 22         this.money = money;
 23     }
 24 
 25     public String getUserName() {
 26         return userName;
 27     }
 28 
 29     public void setUserName(String userName) {
 30         this.userName = userName;
 31     }
 32 
 33     public String getPassWord() {
 34         return passWord;
 35     }
 36 
 37     public void setPassWord(String passWord) {
 38         this.passWord = passWord;
 39     }
 40 
 41     public String getCardNumber() {
 42         return cardNumber;
 43     }
 44 
 45     public void setCardNumber(String cardNumber) {
 46         this.cardNumber = cardNumber;
 47     }
 48 
 49     public ServicePackage getSerPackage() {
 50         return serPackage;
 51     }
 52 
 53     public void setSerPackage(ServicePackage serPackage) {
 54         this.serPackage = serPackage;
 55     }
 56 
 57     public double getConsumAmount() {
 58         return consumAmount;
 59     }
 60 
 61     public void setConsumAmount(double consumAmount) {
 62         this.consumAmount = consumAmount;
 63     }
 64 
 65     public double getMoney() {
 66         return money;
 67     }
 68 
 69     public void setMoney(double money) {
 70         this.money = money;
 71     }
 72 
 73     public int getRealTalkTime() {
 74         return realTalkTime;
 75     }
 76 
 77     public void setRealTalkTime(int realTalkTime) {
 78         this.realTalkTime = realTalkTime;
 79     }
 80 
 81     public int getRealSMSCount() {
 82         return realSMSCount;
 83     }
 84 
 85     public void setRealSMSCount(int realSMSCount) {
 86         this.realSMSCount = realSMSCount;
 87     }
 88 
 89     public int getRealFlow() {
 90         return realFlow;
 91     }
 92 
 93     public void setRealFlow(int realFlow) {
 94         this.realFlow = realFlow;
 95     }
 96     
 97     /**
 98      * 显示卡信息
 99      */
100     public void showMeg(){
101         System.out.println("卡号:"+this.cardNumber+" 用户名:"+this.userName+" 当前余额:"+this.money+"元。");
102         this.serPackage.showInfo();
103     }    
104 }
 1 public class NetPackage extends ServicePackage implements NetService {
 2     private int flow; // 上网流量(MB)
 3     
 4     public NetPackage() {
 5         //套餐数据初始化
 6         this.flow = 1024 * 3;
 7         this.price = 68.0;
 8     }
 9 
10     public NetPackage(int flow) {
11         super();
12         this.flow = flow;
13     }
14     
15     public int getFlow() {
16         return flow;
17     }
18 
19     public void setFlow(int flow) {
20         this.flow = flow;
21     }
22 
23     
24 
25     @Override
26     public void showInfo() {
27         System.out.println("网虫套餐:上网流量是" + flow / 1024 + "GB/月,月资费是"
28                 + this.price + "元/月。");
29     }
30 
31     /**
32      * 提供上网服务
33      */
34     public void netPlay2(int flow, MobileCard card) throws Exception {
35         int reminFlow = this.flow - card.getRealFlow();  //卡中可支付的免费流量
36         // 判断套餐中的上网流量是否足够支付本次上网服务
37         if (this.flow <= reminFlow) {
38             // 套餐中上网流量足够:修改该卡实际上网流量数据
39             card.setRealFlow(card.getRealFlow() + flow);
40         } else {
41             // 套餐中上网流量不够:额外消费需按0.1元/条付费,额外消费金额=0.1*(该卡实际消费上网流量+本次消费上网流量-套餐包含的上网流量)
42             double consumeMoney = 0.1 * (flow-reminFlow);
43             // 该卡账户余额足够支付:修改该卡实际使用的上网流量、账户余额、当月消费金额
44             if (card.getMoney() >= consumeMoney) {
45                 //消耗的流量增加
46                 card.setRealFlow(card.getRealFlow() + flow);
47                 // 当前账户余额=当前账户余额-额外消费金额
48                 card.setMoney(card.getMoney() - consumeMoney);
49                 // 当月消费金额=当月消费金额+额外消费金额
50                 card.setConsumAmount(card.getConsumAmount() + consumeMoney);
51             } else {
52                 
53                 int temp = (int)(card.getMoney()/0.1); //当前余额够大
54                 throw new Exception("您的余额不足,请充值后再使用!");
55             }
56         }
57     }
58     
59     /**
60      * 提供上网服务
61      */
62     public int netPlay(int flow, MobileCard card) throws Exception {
63         int temp = flow;
64         for(int i=0;i<flow;i++){
65             if(this.flow-card.getRealFlow()>=1){
66                 //第一种情况:套餐剩余流量可以支持使用1M流量            
67                 card.setRealFlow(card.getRealFlow()+1); //实际使用流量加1MB                
68             }else if(card.getMoney()>=0.1){
69                 //第二种情况:套餐流量已用完,账户余额可以支付1M流量,使用账户余额支付
70                 card.setRealFlow(card.getRealFlow()+1); //实际使用流量加1MB
71                 card.setMoney(Common.sub(card.getMoney(),0.1)); //账户余额消费0.1元(1M流量费用)
72                 card.setConsumAmount(card.getConsumAmount() + 0.1);
73             }else{
74                 temp = i;
75                 throw new Exception("本次已使用流量"+i+"MB,您的余额不足,请充值后再使用!");
76             }
77         }
78         return temp;
79     }
80 }
 1 public class Scene {
 2     private String type;  //场景消费类型
 3     private int data;  //消费数据
 4     private String description;//场景描述
 5     
 6     public Scene(){}
 7     public Scene(String type,int data,String description){
 8         this.type = type;
 9         this.data = data;
10         this.description = description;
11     }  
12     
13     public String getType() {
14         return type;
15     }
16     public void setType(String type) {
17         this.type = type;
18     }
19     public int getData() {
20         return data;
21     }
22     public void setData(int data) {
23         this.data = data;
24     }
25     public String getDescription() {
26         return description;
27     }
28     public void setDescription(String description) {
29         this.description = description;
30     }
31     
32 }
 1 public abstract class ServicePackage {    
 2     protected double price;  //套餐月资费(元)
 3      
 4     public double getPrice() {
 5         return price;
 6     }
 7 
 8     public void setPrice(double price) {
 9         this.price = price;
10     }
11 
12     //显示套餐数据
13     public abstract void showInfo();
14 }
  1 public class SuperPackage extends ServicePackage implements CallService,
  2 SendService,NetService {
  3     private int talkTime;   //通话时长(分钟)
  4     private int smsCount;   //短信条数(条)
  5     private int flow;  //上网流量(MB)
  6        
  7     public int getTalkTime() {
  8         return talkTime;
  9     }
 10 
 11 
 12     public void setTalkTime(int talkTime) {
 13         this.talkTime = talkTime;
 14     }
 15 
 16 
 17     public int getSmsCount() {
 18         return smsCount;
 19     }
 20 
 21 
 22     public void setSmsCount(int smsCount) {
 23         this.smsCount = smsCount;
 24     }
 25     
 26     public int getFlow() {
 27         return flow;
 28     }
 29 
 30     public void setFlow(int flow) {
 31         this.flow = flow;
 32     }
 33     
 34     public SuperPackage(){
 35         //套餐数据初始化
 36         this.talkTime = 200;
 37         this.smsCount = 50;
 38         this.flow = 1*1024;  
 39         this.price = 78.0;
 40     }
 41     @Override
 42     public void showInfo() {
 43         System.out.println("超人套餐:通话时长为"+this.talkTime+"分钟/月,短信条数为"+this.smsCount+"条/月,上网流量为"+this.flow/1024+"GB/月。");
 44     }
 45 
 46 
 47     /**
 48      * 提供上网服务
 49      */
 50     public int netPlay(int flow, MobileCard card) throws Exception {
 51         int temp = flow;
 52         for(int i=0;i<flow;i++){
 53             if(this.flow-card.getRealFlow()>=1){
 54                 //第一种情况:套餐剩余流量可以支持使用1M流量            
 55                 card.setRealFlow(card.getRealFlow()+1); //实际使用流量加1MB                
 56             }else if(card.getMoney()>=0.1){
 57                 //第二种情况:套餐流量已用完,账户余额可以支付1M流量,使用账户余额支付
 58                 card.setRealFlow(card.getRealFlow()+1); //实际使用流量加1MB
 59                 card.setMoney(Common.sub(card.getMoney(),0.1)); //账户余额消费0.1元(1M流量费用)
 60                 card.setConsumAmount(card.getConsumAmount() + 0.1);
 61             }else{
 62                 temp = i;
 63                 throw new Exception("本次已使用流量"+i+"MB,您的余额不足,请充值后再使用!");
 64             }
 65         }
 66         return temp;
 67     }
 68 
 69     /**
 70      * 提供通话服务
 71      */
 72     public int call(int minCount, MobileCard card) throws Exception{
 73         int temp = minCount; 
 74         for(int i=0;i<minCount;i++){
 75             if(this.talkTime-card.getRealTalkTime()>=1){
 76                 //第一种情况:套餐剩余通话时长可以付1分钟通话            
 77                 card.setRealTalkTime(card.getRealTalkTime()+1); //实际通话数据加1                
 78             }else if(card.getMoney()>=0.2){
 79                 //第二种情况:套餐通话时长已用完,账户余额可以支付1分钟通话,使用账户余额支付
 80                 card.setRealTalkTime(card.getRealTalkTime()+1); //实际使用通话时长1分钟 
 81                 card.setMoney(Common.sub(card.getMoney(),0.2)); //账户余额消费0.2元(1分钟额外通话)
 82                 card.setConsumAmount(card.getConsumAmount() + 0.2);
 83             }else{
 84                 temp = i; //记录实现通话分钟数
 85                 throw new Exception("本次已通话"+i+"分钟,您的余额不足,请充值后再使用!");                
 86             }
 87         }
 88         return temp;
 89     }
 90     
 91     /**
 92      * 提供短信服务
 93      */
 94     public int sendMessage(int smsCount, MobileCard card) throws Exception {
 95         int temp = smsCount;
 96         for(int i=0;i<smsCount;i++){
 97             if(this.smsCount-card.getRealSMSCount()>=1){
 98                 //第一种情况:套餐剩余短信条数可以付1条短信            
 99                 card.setRealSMSCount(card.getRealSMSCount()+1); //实际使用短信条数加1                
100             }else if(card.getMoney()>=0.1){
101                 //第二种情况:套餐短信条数已用完,账户余额可以支付1条短信,使用账户余额支付
102                 card.setRealSMSCount(card.getRealSMSCount()+1); 
103                 card.setMoney(Common.sub(card.getMoney(),0.1)); //账户余额消费0.1元(1条短信费用)
104                 card.setConsumAmount(card.getConsumAmount() + 0.1);
105             }else{
106                 temp = i;
107                 throw new Exception("本次已发送短信"+i+"条,您的余额不足,请充值后再使用!");
108             }
109         }
110         return temp;
111     }
112 
113 }
 1 public class TalkPackage extends ServicePackage implements CallService,
 2         SendService {
 3     private int talkTime; // 通话时长(分钟)
 4     private int smsCount; // 短信条数(条)
 5 
 6     public int getTalkTime() {
 7         return talkTime;
 8     }
 9 
10     public void setTalkTime(int talkTime) {
11         this.talkTime = talkTime;
12     }
13 
14     public int getSmsCount() {
15         return smsCount;
16     }
17 
18     public void setSmsCount(int smsCount) {
19         this.smsCount = smsCount;
20     }
21 
22     public TalkPackage() {
23         //套餐数据初始化
24         this.talkTime = 500;
25         this.smsCount = 30;
26         this.price = 58.0;
27     }
28 
29     public TalkPackage(int talkTime, int smsCount) {
30         super();
31         this.talkTime = talkTime;
32         this.smsCount = smsCount;
33     }
34 
35     /**
36      * 显示套餐详情
37      */
38     public void showInfo() {
39         System.out.println("话唠套餐:通话时长为" + this.talkTime + "分钟/月,短信条数为"
40                 + this.smsCount + "条/月,资费为" + this.price + "元/月。");
41     }
42     
43     public int call(int minCount, MobileCard card) throws Exception{
44         int temp = minCount; 
45         for(int i=0;i<minCount;i++){
46             if(this.talkTime-card.getRealTalkTime()>=1){
47                 //第一种情况:套餐剩余通话时长可以付1分钟通话            
48                 card.setRealTalkTime(card.getRealTalkTime()+1); //实际使用流量加1MB                
49             }else if(card.getMoney()>=0.2){
50                 //第二种情况:套餐通话时长已用完,账户余额可以支付1分钟通话,使用账户余额支付
51                 card.setRealTalkTime(card.getRealTalkTime()+1); //实际使用通话时长1分钟 
52                 card.setMoney(Common.sub(card.getMoney(),0.2)); //账户余额消费0.2元(1M流量费用)
53                 card.setConsumAmount(card.getConsumAmount() + 0.2);
54             }else{
55                 temp = i; //记录实现通话分钟数
56                 throw new Exception("本次已通话"+i+"分钟,您的余额不足,请充值后再使用!");                
57             }
58         }
59         return temp;
60     }
61         
62     public int sendMessage(int smsCount, MobileCard card) throws Exception {
63         int temp = smsCount;
64         for(int i=0;i<smsCount;i++){
65             if(this.smsCount-card.getRealSMSCount()>=1){
66                 //第一种情况:套餐剩余短信条数可以付1条短信            
67                 card.setRealSMSCount(card.getRealSMSCount()+1); //实际使用短信条数加1                
68             }else if(card.getMoney()>=0.1){
69                 //第二种情况:套餐短信条数已用完,账户余额可以支付1条短信,使用账户余额支付
70                 card.setRealSMSCount(card.getRealSMSCount()+1); 
71                 card.setMoney(Common.sub(card.getMoney(),0.1)); //账户余额消费0.1元(1条短信费用)
72                 card.setConsumAmount(card.getConsumAmount() + 0.1);
73             }else{
74                 temp = i;
75                 throw new Exception("本次已发送短信"+i+"条,您的余额不足,请充值后再使用!");
76             }
77         }
78         return temp;
79     }
80     
81 }
1 public interface CallService {
2     //打电话
3       public int call(int minCount,MobileCard card) throws Exception;
4 }
1 public interface NetService {
2     //上网
3      public int netPlay(int flow,MobileCard card) throws Exception;
4 }
1 public interface SendService {
2     //发短信
3      public int sendMessage(int count,MobileCard card) throws Exception;
4 }
  1 public class CardUtil {
  2     Map<String, MobileCard> cards = new HashMap<String, MobileCard>(); // 所有手机卡的列表
  3     Map<String, List<ConsumInfo>> consumInfos = new HashMap<String, List<ConsumInfo>>(); // 所有手机卡消费记录的列表
  4     List<Scene> scenes = new ArrayList<Scene>();
  5 
  6     // 初始化用户
  7     public void init() {
  8         MobileCard card1 = new MobileCard("何玲玲", "123", "13965756432",
  9                 new TalkPackage(), 58.0, 42.0);
 10         MobileCard card2 = new MobileCard("黄露露", "123", "13956712467",
 11                 new NetPackage(), 68.0, 32.0);
 12         MobileCard card3 = new MobileCard("朱蓉蓉", "123", "13911568956",
 13                 new SuperPackage(), 78.0, 22.0);
 14         MobileCard card4 = new MobileCard("桃跑跑", "123", "13924221868",
 15                 new TalkPackage(), 78.0, 2.0);
 16         card4.setConsumAmount(98.0);
 17         card4.setRealTalkTime(500);
 18         card4.setRealSMSCount(100);
 19         cards.put("13965756432", card1);
 20         cards.put("13956712467", card2);
 21         cards.put("13911568956", card3);
 22         cards.put("13924221868", card4);
 23     }
 24     
 25     /**
 26      * 使用场景初始化
 27      */
 28     public void initScenes(){    
 29         scenes.add(new Scene("通话",90,"问候客户,谁知其如此难缠 通话90分钟"));
 30         scenes.add(new Scene("通话",30,"询问妈妈身体状况 本地通话30分钟"));
 31         scenes.add(new Scene("短信",5,"参与环境保护实施方案问卷调查 发送短信5条"));
 32         scenes.add(new Scene("短信",50,"通知朋友手机换号,发送短信50条"));
 33         scenes.add(new Scene("上网",1*1024,"和女友微信视频聊天   使用流量1G"));
 34         scenes.add(new Scene("上网",2*1024,"晚上手机在线看韩剧,不留神睡着啦! 使用流量 2G"));        
 35     }
 36 
 37     /**
 38      * 是否存在此卡用户
 39      */
 40     public boolean isExistCard(String number, String passWord) {
 41         Set<String> numbers = cards.keySet();
 42         Iterator<String> it = numbers.iterator();
 43         while (it.hasNext()) {
 44             String searchNum = it.next();
 45             if (searchNum.equals(number)
 46                     && (cards.get(searchNum)).getPassWord().equals(passWord)) {
 47                 return true;
 48             }
 49         }
 50         return false;
 51     }
 52     
 53     /**
 54      * 查找指定卡号是否已注册
 55      * 
 56      */
 57     public boolean isExistCard(String searchNumber) {
 58         Set<String> numbers = cards.keySet();
 59         for (String number : numbers) {
 60             if (number.equals(searchNumber)) {
 61                 return true;
 62             }
 63         }
 64         return false;
 65     }
 66 
 67     /**
 68      * 创建卡号(以139开头 11位)
 69      */
 70     public String createNumber() {
 71         Random random = new Random();
 72         boolean isExist = false; // 记录现有用户中是否存在此卡号用户 是:true 否:false
 73         String number = "";
 74         int temp = 0;
 75         do {
 76             isExist = false; // 标志位重置为false,用于控制外重循环,当生成了
 77             // 生成的随机数是8位 不能小于10000000,否则重新生成
 78             do {
 79                 temp = random.nextInt(100000000);
 80             } while (temp < 10000000);
 81             // 生成之前,前面加“139”
 82             number = "139" + temp;
 83             // 和现有用户的卡号比较,不能是重复
 84             Set<String> cardNumbers = cards.keySet();
 85             for (String cardNumber : cardNumbers) {
 86                 if (number.equals(cardNumber)) {
 87                     isExist = true;
 88                     break;
 89                 }
 90             }
 91         } while (isExist);
 92         return number;
 93     }
 94 
 95     /**
 96      * 生成指定个数的新卡号列表
 97      */
 98     public String[] getNewNumbers(int count) {
 99 
100         String[] numbers = new String[count];
101         for (int i = 0; i < count; i++) {
102             numbers[i] = createNumber();
103         }
104         return numbers;
105     }
106 
107     /**
108      * 添加新卡
109      */
110     public void addCard(MobileCard card) {
111         cards.put(card.getCardNumber(), card);
112         System.out.print("注册成功!");
113         card.showMeg();
114     }
115 
116     /**
117      * 指定卡号办理退网
118      */
119     public void delCard(String delNumber) {
120         if (isExistCard(delNumber)) {
121             cards.remove(delNumber);
122             System.out.println("卡号" + delNumber + "办理退网成功!");
123         } else {
124             System.out.println("对不起,该卡号未注册,不能办退退网!");
125         }
126     }
127 
128     /**
129      * 查询指定卡套餐余量
130      */
131     public void showRemainDetail(String searchNumber) {
132         MobileCard card; // 要查询的卡
133         int remainTalkTime;
134         int remainSmsCount;
135         int remainFlow;
136         StringBuffer meg = new StringBuffer();
137             card = cards.get(searchNumber);
138             meg.append("您的卡号是" + searchNumber + ",套餐内剩余:
");
139             ServicePackage pack = card.getSerPackage();
140             if (pack instanceof TalkPackage) {
141                 //向下转型为话唠套餐对象
142                 TalkPackage cardPack = (TalkPackage) pack;
143                 // 话唠套餐,查询套餐内剩余的通话时长和短信条数
144                 remainTalkTime = cardPack.getTalkTime() > card
145                         .getRealTalkTime() ? cardPack.getTalkTime()
146                         - card.getRealTalkTime() : 0;
147                 meg.append("通话时长:" + remainTalkTime + "分钟
");
148                 remainSmsCount = cardPack.getSmsCount() > card
149                         .getRealSMSCount() ? cardPack.getSmsCount()
150                         - card.getRealSMSCount() : 0;
151                 meg.append("短信条数:" + remainSmsCount + "条");
152             } else if (pack instanceof NetPackage) {
153                 //向下转型为网虫套餐对象
154                 NetPackage cardPack = (NetPackage) pack;
155                 // 网虫套餐:查询套餐内剩余的上网流量
156                 remainFlow = cardPack.getFlow() > card.getRealFlow() ? cardPack
157                         .getFlow() - card.getRealFlow() : 0;
158                 meg.append("上网流量:" + Common.dataFormat(remainFlow * 1.0 / 1024)
159                         + "GB");
160             } else if (pack instanceof SuperPackage) {
161                 //向下转型为超人套餐对象
162                 SuperPackage cardPack = (SuperPackage) pack;
163                 // 超人套餐:查询套餐内剩余的通话时长、短信条数、上网流量
164                 remainTalkTime = cardPack.getTalkTime() > card
165                         .getRealTalkTime() ? cardPack.getTalkTime()
166                         - card.getRealTalkTime() : 0;
167                 meg.append("通话时长:" + remainTalkTime + "分钟
");
168                 remainSmsCount = cardPack.getSmsCount() > card
169                         .getRealSMSCount() ? cardPack.getSmsCount()
170                         - card.getRealSMSCount() : 0;
171                 meg.append("短信条数:" + remainSmsCount + "条
");
172                 remainFlow = cardPack.getFlow() > card.getRealFlow() ? cardPack
173                         .getFlow() - card.getRealFlow() : 0;
174                 meg.append("上网流量:" + Common.dataFormat(remainFlow * 1.0 / 1024)
175                         + "GB");
176             }
177             System.out.println(meg);
178     }
179 
180     /**
181      * 查询指定卡当月消费详单
182      */
183     public void showAmountDetail(String searchNumber) {
184         MobileCard card; // 要查询的卡
185         StringBuffer meg = new StringBuffer();
186         card = cards.get(searchNumber);
187         meg.append("您的卡号:" + card.getCardNumber() + ",当月账单:
");
188         meg.append("套餐资费:" + card.getSerPackage().getPrice() + "元
");
189         meg.append("合计:" + Common.dataFormat(card.getConsumAmount()) + "元
");
190         meg.append("账户余额:" + Common.dataFormat(card.getMoney()) + "元");
191         // 显示本月消费详细信息
192         System.out.println(meg);
193     }
194 
195     
196     /**
197      * 指定卡号换套餐
198      */
199     public void changingPack(String number, int packNum) {
200         MobileCard card; // 指定的手机卡
201         ServicePackage pack; // 要换的套餐
202         if (isExistCard(number)) {
203             card = cards.get(number);
204             // 获取要换的套餐对象
205             switch (packNum) {
206             case 1:
207                 pack = new TalkPackage();
208                 break;
209             case 2:
210                 pack = new NetPackage();
211                 break;
212             default:
213                 pack = new SuperPackage();
214                 break;
215             }        
216             if (!(card.getSerPackage().getClass().getName().equals(pack.getClass().getName()))) {
217                 // 该卡余额中减去当月套餐资费
218                 if (card.getMoney() >= pack.getPrice()) {
219                     card.setMoney(card.getMoney() - pack.getPrice());
220                     // 换套餐
221                     card.setSerPackage(pack);
222                     // 当月实际使用数据清零
223                     card.setRealTalkTime(0);
224                     card.setRealFlow(0);
225                     card.setRealSMSCount(0);
226                     // 当月消费金额设置为新套餐月资费
227                     card.setConsumAmount(pack.getPrice());
228                     System.out.print("更换套餐成功!");
229                     pack.showInfo();
230                 } else {
231                     System.out.println("对不起,您的余额不足以支付新套餐本月资费,请充值后再办理更换套餐业务!");
232                     return;
233                 }
234             } else {
235                 System.out.println("对不起,您已经是该套餐用户,无需换套餐!");
236             }
237 
238         } else {
239             System.out.println("对不起,该卡号未注册,不能换套餐!");
240         }
241     }
242 
243     /**
244      * 为指定手机卡充值
245      */
246     public void chargeMoney(String number, double money) {
247         MobileCard card; // 指定的手机卡
248         if (money < 50) {
249             System.out.println("对不起,最低充值金额为50元!");
250             return;
251         }
252             card = cards.get(number);
253             card.setMoney(card.getMoney() + money);
254             System.out.println("充值成功,当前话费余额为" + Common.dataFormat(card.getMoney()) + "元。");
255     }
256 
257     /**
258      * 添加一条指定卡的消费记录
259      */
260     public void addConsumInfo(String number, ConsumInfo info) {
261         Set<String> numbers = consumInfos.keySet();
262         Iterator<String> it = numbers.iterator();
263         List<ConsumInfo> infos = new ArrayList<ConsumInfo>();
264         boolean isExist = false; // 现有消费列表中是否存在此卡号消费记录,是:true 否:false
265         while (it.hasNext()) {
266             if (it.next().equals(number)) {
267                 // 消费集合中已有该卡号消费记录,则找到该卡号的消费记录集合,添加一条即可
268                 infos = consumInfos.get(number);
269                 infos.add(info);
270                 isExist = true;
271                 System.out.println("已添加一条消费记录。");
272                 break;
273             }
274         }
275         // 该集合中没有此卡号消费记录,则添加
276         if (!isExist) {
277             infos.add(info);
278             consumInfos.put(number, infos);
279             System.out.println("不存在此卡的消费记录,已添加一条消费记录。");
280         }
281     }
282     
283     //打印消费记录
284     public void printConsumInfo(String number){
285         Writer fileWriter = null;
286         try {
287              fileWriter = new FileWriter(number+"消费记录.txt");            
288             Set<String> numbers = consumInfos.keySet();
289             Iterator<String> it = numbers.iterator();
290             List<ConsumInfo> infos = new ArrayList<ConsumInfo>();//存储指定卡所有消费记录
291             boolean isExist = false; // 现有消费列表中是否存在此卡号消费记录,是:true 否:false
292             while (it.hasNext()) {
293                 if (it.next().equals(number)) {
294                     infos = consumInfos.get(number);
295                     isExist = true;
296                     break;
297                 }
298             }
299             if(isExist){
300                 //存在 此卡消费记录,写入文本文件
301                 StringBuffer content = new StringBuffer("******"+number+"消费记录******
");
302                 content.append("序号	类型	数据(通话(条)/上网(MB)/短信(条))
");
303                 for(int i=0;i<infos.size();i++){
304                     ConsumInfo info = infos.get(i);
305                     content.append((i+1)+".	"+info.getType()+"	"+info.getConsumData()+"
");
306                 }
307                 fileWriter.write(content.toString());
308                 fileWriter.flush();
309                 
310                 System.out.println("消费记录打印完毕!");
311             }else{
312                 System.out.println("对不起,不存在此号码的消费记录,不能打印!");
313             }            
314         } catch (IOException e) {            
315             e.printStackTrace();
316         }finally{
317             if(fileWriter!=null){
318                 try {
319                     fileWriter.close();
320                 } catch (IOException e) {                    
321                     e.printStackTrace();
322                 }
323             }
324         }
325     }
326     
327     /**
328      * 使用嗖嗖
329      */
330     public void userSoso(String number)  {        
331         MobileCard card = cards.get(number); // 获取此卡对象
332         ServicePackage pack = card.getSerPackage(); // 获取此卡所属套餐
333         Random random = new Random();
334         int ranNum = 0;
335         int temp = 0;  //记录各场景中实际消费数据
336         do{
337             
338             ranNum = random.nextInt(6);// 生成一个0~5之前的随机数
339             Scene scene = scenes.get(ranNum); //获取该序号所对应的场景
340             switch (ranNum) {
341             //序号为0或1为通话场景
342             case 0:
343             case 1:
344                 // 判断该卡所属套餐是否支持通话功能
345                 if (pack instanceof CallService) {
346                     // 执行通话方法
347                     System.out.println(scene.getDescription());
348                     CallService callService = (CallService) pack;
349                     try {
350                         temp = callService.call(scene.getData(), card);
351                     } catch (Exception e) {                            
352                         e.printStackTrace();
353                     }
354                     // 添加一条消费记录
355                     addConsumInfo(number, new ConsumInfo(number,
356                             scene.getType(), temp));
357                     break;
358                 } else {
359                     // 如果该卡套餐不支持通话功能,则重新生成随机数选择其他场景
360                     continue;
361                 }
362                 //序号为2或3为发短信场景
363             case 2:
364             case 3:
365                 // 判断该卡所属套餐是否支持短信功能
366                 if (pack instanceof SendService) {
367                     // 执行发短信方法
368                     System.out.println(scene.getDescription());
369                     SendService sendService = (SendService) pack;
370                     try {
371                         temp = sendService.sendMessage(scene.getData(), card);
372                     } catch (Exception e) {                                                    
373                         e.printStackTrace();
374                     }
375                     // 添加一条消费记录
376                     addConsumInfo(number, new ConsumInfo(number,
377                             scene.getType(), temp));
378                     break;
379                 } else {
380                     // 如果该卡套餐不支持发短信功能,则重新生成随机数选择其他场景
381                     continue;
382                 }
383                 //序号为4或5为发上网场景
384             case 4:
385             case 5:
386                 // 判断该卡所属套餐是否支持上网功能
387                 if (pack instanceof NetService) { 
388                     System.out.println(scene.getDescription());
389                     NetService netService = (NetService) pack;
390                     // 执行上网方法
391                     try {
392                         temp = netService.netPlay(scene.getData(), card);
393                     } catch (Exception e) {                        
394                         e.printStackTrace();
395                     }
396                     // 添加一条消费记录
397                     addConsumInfo(number, new ConsumInfo(number,
398                             scene.getType(), temp));
399                     break;
400                 } else {
401                     // 如果该卡套餐不支持上网功能,则重新生成随机数选择其他场景
402                     continue;
403                 }                
404             }    
405             break;
406         }while(true);
407     }
408 
409     /**
410      * 根据套餐序号返回套餐对象
411      */
412     public ServicePackage createPack(int packId) {
413         ServicePackage pack = null;
414         switch (packId) {
415         case 1:
416             pack = new TalkPackage();
417             break;
418         case 2:
419             pack = new NetPackage();
420             break;
421         case 3:
422             pack = new SuperPackage();
423             break;
424         }
425         return pack;
426     }
427     
428     /**
429      * 显示资费说明
430      */
431     public void showDescription(){
432         Reader rd = null;
433         try {
434             rd = new FileReader("套餐资费说明.txt");
435             int len = 0;
436              char[] content = new char[1024];
437              StringBuffer sb = new StringBuffer();
438                 while((len=rd.read(content))!=-1){
439                     sb.append(content,0,len);  //拼接字符串
440                 }
441                 System.out.println(sb);
442         } catch (IOException e) {
443             e.printStackTrace();
444         }
445     }
446     
447 }
原文地址:https://www.cnblogs.com/daiwenxiang/p/12061108.html