一、项目简介

  • 项目名:嗖嗖移动业务大厅

  • 技能点:

  

二、技能点 

  

三、系统概述

  

四、整体开发思路

  

五、实体类和接口开发

   

  

六、 创建工具类

  

七、使用集合存储数据

  

八、开发计划

  

九、代码实现  

  1.项目目录

  

  2.具体代码

  • 测试类
package cn.soso.biz;

import java.util.Scanner;

import cn.soso.entity.MobileCard;
import cn.soso.entity.ServicePackage;
import cn.soso.utils.CardUtil; /**
* 业务类
*
* @author yu
*
*/
public class SosoMgr {
Scanner input = new Scanner(System.in);
CardUtil utils = new CardUtil(); public static void main(String[] args) {
SosoMgr soso = new SosoMgr();
soso.mainMenu();
System.out.println("谢谢使用!");
} /**
* 主流程
*/
public void mainMenu() {
int menuChoose = 0;
String mobileNumber= "";
String password = "";
utils.init();
utils.initScenes();
//Common.typesInit();
do {
System.out.println("\n*************欢迎使用嗖嗖移动业务大厅***************");
System.out.println("1.用户登录 2.用户注册 3.使用嗖嗖 4.话费充值 5.资费说明 6.退出系统");
System.out.print("请选择:");
menuChoose = input.nextInt();
// 分支语句:根据功能编号执行相应功能
switch (menuChoose) {
case 1:
//用户登录
System.out.print("请输入手机卡号:");
mobileNumber = input.next();
System.out.print("请输入密码:");
password = input.next();
if (utils.isExistCard(mobileNumber, password)) {
cardMenu(mobileNumber);
}else{
System.out.println("对不起,您输入的信息有误,无法登录!");
}
continue;
case 2:
//用户注册
registCard();
continue;
case 3: //使用嗖嗖
System.out.print("请输入手机卡号:");
mobileNumber = input.next(); if (utils.isExistCard(mobileNumber)) {
try {
/*System.out.println("****使用之前****");
cn.soso.utils.showRemainDetail(mobileNumber);
cn.soso.utils.showAmountDetail(mobileNumber);*/
utils.userSoso(mobileNumber);
} catch (Exception e) {
System.err.println(e.getMessage());
}
}else{
System.out.println("对不起,该卡号未注册,不能使用!");
} /*System.out.println("****使用之后****");
cn.soso.utils.showRemainDetail(mobileNumber);
cn.soso.utils.showAmountDetail(mobileNumber);*/
continue;
case 4:
//话费充值
System.out.print("请输入充值卡号:");
mobileNumber = input.next();
if (utils.isExistCard(mobileNumber)) {
System.out.print("请输入充值金额:");
double money = input.nextDouble();
utils.chargeMoney(mobileNumber, money);
}else{
System.out.println("对不起,要充值的卡号未注册,无法充值!");
}
continue;
case 5:
System.out.println("\n*****资费说明******");
utils.showDescription();
continue;
case 6:
//退出系统
break;
default:
//选择其他数字退出系统
break;
}
break;
} while (true);
} /**
* 手机卡功能菜单
*
* @param number
* @return
*/
public int cardMenu(String mobileNumber) {
int menuChoose = 0;
do {
System.out.println("\n*****嗖嗖移动用户菜单*****");
System.out.println("1.本月账单查询");
System.out.println("2.套餐余量查询");
System.out.println("3.打印消费详单");
System.out.println("4.套餐变更");
System.out.println("5.办理退网");
System.out.print("请选择(输入1~5选择功能,其他键返回上一级):");
menuChoose = input.nextInt();
switch (menuChoose) {
case 1:
System.out.println("\n*****本月账单查询******");
utils.showAmountDetail(mobileNumber);
continue;
case 2:
System.out.println("\n*****套餐余量查询******");
utils.showRemainDetail(mobileNumber);
continue;
case 3:
System.out.println("\n*****消费详单查询******");
utils.printConsumInfo(mobileNumber);
continue;
case 4:
System.out.println("\n*****套餐变更******");
System.out.print("1.话唠套餐 2.网虫套餐 3.超人套餐 请选择(序号):");
utils.changingPack(mobileNumber, input.next());
continue;
case 5:
System.out.println("\n*****办理退网******");
utils.delCard(mobileNumber);
System.out.println("谢谢使用!");
System.exit(1); //办理退网后退出系统 } break;
} while (true);
return menuChoose;
} /**
* 注册新卡流程
*/
public void registCard(){
String[] newNumbers = utils.getNewNumbers(9);
//显示可供选择的手机号列表
System.out.println("*****可选择的卡号*****"); for(int i=0;i<9;i++){
System.out.print((i+1)+"."+newNumbers[i]+"\t\t");
if((i+1)%3==0){
System.out.println();
}
}
//选择手机号
System.out.print("请选择卡号(输入1~9的序号):");
String number = newNumbers[input.nextInt()-1]; //选择套餐类型
System.out.print("1.话唠套餐 2.网虫套餐 3.超人套餐, ");
System.out.print("请选择套餐(输入序号):");
//cn.soso.utils.getPackList();
//获取套餐对象
ServicePackage pack = utils.createPack(input.nextInt()); //输入用户名
System.out.print("请输入姓名:");
String name = input.next(); //输入密码
System.out.print("请输入密码:");
String password = input.next(); //输入预存话费金额
double money = 0;
System.out.print("请输入预存话费金额:");
money = input.nextDouble();
while(money<pack.getPrice()){
System.out.print("您预存的话费金额不足以支付本月固定套餐资费,请重新充值:");
money = input.nextDouble();
} //创建新卡对象并添加
MobileCard newCard = new MobileCard(name,password,number,pack,pack.getPrice(),money-pack.getPrice());
utils.addCard(newCard);
}
}
  • 公共类
package cn.soso.common;

import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.Map; /**
* 公共类
* @author yu
*
*/
public class Common {
/**
* double类型格式化
* @param data
* @return
*/
public static String dataFormat(double data) {
DecimalFormat formatData = new DecimalFormat("#.0");
return formatData.format(data);
} /**
* double类型两数相减
* @param num1
* @param num2
* @return
*/
public static double sub(double num1,double num2){
return (num1*10-num2*10)/10;
}
}
package cn.soso.common;
/**
* 消费类型
* @author rong.zhou
*
*/
public enum ConsumType {
TALK,SMS,NETWORK
}
  • 实体类
package cn.soso.entity;
import cn.soso.common.ConsumType;
/**
* 消费信息
* @author yu
*
*/
public class ConsumInfo {
private String cardNumber; //卡号
private String type; //消费类型:通话、发短信、上网
private int consumData; //消费数据 通话:分钟 发短信:条 上网:MB public ConsumInfo(){}
public ConsumInfo(String cardNumber, String type, int consumData) {
super();
this.cardNumber = cardNumber;
this.type = type;
this.consumData = consumData;
}
public String getCardNumber() {
return cardNumber;
}
public void setCardNumber(String cardNumber) {
this.cardNumber = cardNumber;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public int getConsumData() {
return consumData;
}
public void setConsumData(int consumData) {
this.consumData = consumData;
}
}
package cn.soso.entity;
/**
* 手机卡
* @author yu
*
*/
public class MobileCard {
private String cardNumber; //卡号
private String userName; //用户名
private String passWord; //密码
private ServicePackage serPackage; //所属套餐
private double consumAmount; //当月消费金额
private double money; //账户余额
private int realTalkTime; //实际通话时长(分钟)
private int realSMSCount; //实际发送短信条数(条)
private int realFlow; //实际上网流量 public MobileCard(){} public MobileCard(String userName, String passWord, String cardNumber,
ServicePackage serPackage, double consumAmount, double money) {
super();
this.userName = userName;
this.passWord = passWord;
this.cardNumber = cardNumber;
this.serPackage = serPackage;
this.consumAmount = consumAmount;
this.money = money;
} public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public String getPassWord() {
return passWord;
} public void setPassWord(String passWord) {
this.passWord = passWord;
} public String getCardNumber() {
return cardNumber;
} public void setCardNumber(String cardNumber) {
this.cardNumber = cardNumber;
} public ServicePackage getSerPackage() {
return serPackage;
} public void setSerPackage(ServicePackage serPackage) {
this.serPackage = serPackage;
} public double getConsumAmount() {
return consumAmount;
} public void setConsumAmount(double consumAmount) {
this.consumAmount = consumAmount;
} public double getMoney() {
return money;
} public void setMoney(double money) {
this.money = money;
} public int getRealTalkTime() {
return realTalkTime;
} public void setRealTalkTime(int realTalkTime) {
this.realTalkTime = realTalkTime;
} public int getRealSMSCount() {
return realSMSCount;
} public void setRealSMSCount(int realSMSCount) {
this.realSMSCount = realSMSCount;
} public int getRealFlow() {
return realFlow;
} public void setRealFlow(int realFlow) {
this.realFlow = realFlow;
} /**
* 显示卡信息
*/
public void showMeg(){
System.out.println("卡号:"+this.cardNumber+" 用户名:"+this.userName+" 当前余额:"+this.money+"元。");
this.serPackage.showInfo();
}
}
package cn.soso.entity;

import cn.soso.common.Common;
import cn.soso.service.NetService; /**
* 网虫套餐
*
* @author yu
*
*/
public class NetPackage extends ServicePackage implements NetService {
private int flow; // 上网流量(MB) public NetPackage() {
//套餐数据初始化
this.flow = 1024 * 3;
this.price = 68.0;
} public NetPackage(int flow) {
super();
this.flow = flow;
} public int getFlow() {
return flow;
} public void setFlow(int flow) {
this.flow = flow;
} @Override
public void showInfo() {
System.out.println("网虫套餐:上网流量是" + flow / 1024 + "GB/月,月资费是"
+ this.price + "元/月。");
} /**
* 提供上网服务
*/
public void netPlay2(int flow, MobileCard card) throws Exception {
int reminFlow = this.flow - card.getRealFlow(); //卡中可支付的免费流量
// 判断套餐中的上网流量是否足够支付本次上网服务
if (this.flow <= reminFlow) {
// 套餐中上网流量足够:修改该卡实际上网流量数据
card.setRealFlow(card.getRealFlow() + flow);
} else {
// 套餐中上网流量不够:额外消费需按0.1元/条付费,额外消费金额=0.1*(该卡实际消费上网流量+本次消费上网流量-套餐包含的上网流量)
double consumeMoney = 0.1 * (flow-reminFlow);
// 该卡账户余额足够支付:修改该卡实际使用的上网流量、账户余额、当月消费金额
if (card.getMoney() >= consumeMoney) {
//消耗的流量增加
card.setRealFlow(card.getRealFlow() + flow);
// 当前账户余额=当前账户余额-额外消费金额
card.setMoney(card.getMoney() - consumeMoney);
// 当月消费金额=当月消费金额+额外消费金额
card.setConsumAmount(card.getConsumAmount() + consumeMoney);
} else { int temp = (int)(card.getMoney()/0.1); //当前余额够大
throw new Exception("您的余额不足,请充值后再使用!");
}
}
} /**
* 提供上网服务
*/
public int netPlay(int flow, MobileCard card) throws Exception {
int temp = flow;
for(int i=0;i<flow;i++){
if(this.flow-card.getRealFlow()>=1){
//第一种情况:套餐剩余流量可以支持使用1M流量
card.setRealFlow(card.getRealFlow()+1); //实际使用流量加1MB
}else if(card.getMoney()>=0.1){
//第二种情况:套餐流量已用完,账户余额可以支付1M流量,使用账户余额支付
card.setRealFlow(card.getRealFlow()+1); //实际使用流量加1MB
card.setMoney(Common.sub(card.getMoney(),0.1)); //账户余额消费0.1元(1M流量费用)
card.setConsumAmount(card.getConsumAmount() + 0.1);
}else{
temp = i;
throw new Exception("本次已使用流量"+i+"MB,您的余额不足,请充值后再使用!");
}
}
return temp;
}
}
package cn.soso.entity;
/**
* 使用场景
* @author yu
*
*/
public class Scene {
private String type; //场景消费类型
private int data; //消费数据
private String description;//场景描述 public Scene(){}
public Scene(String type,int data,String description){
this.type = type;
this.data = data;
this.description = description;
} public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
} }
package cn.soso.entity;
/**
* 嗖嗖移动卡套餐
* @author yu
*
*/
public abstract class ServicePackage {
protected double price; //套餐月资费(元) public double getPrice() {
return price;
} public void setPrice(double price) {
this.price = price;
} //显示套餐数据
public abstract void showInfo();
}
package cn.soso.entity;

import cn.soso.common.Common;
import cn.soso.service.CallService;
import cn.soso.service.NetService;
import cn.soso.service.SendService; /**
* 超人套餐
* @author yu
*
*/
public class SuperPackage extends ServicePackage implements CallService,
SendService,NetService {
private int talkTime; //通话时长(分钟)
private int smsCount; //短信条数(条)
private int flow; //上网流量(MB) public int getTalkTime() {
return talkTime;
} public void setTalkTime(int talkTime) {
this.talkTime = talkTime;
} public int getSmsCount() {
return smsCount;
} public void setSmsCount(int smsCount) {
this.smsCount = smsCount;
} public int getFlow() {
return flow;
} public void setFlow(int flow) {
this.flow = flow;
} public SuperPackage(){
//套餐数据初始化
this.talkTime = 200;
this.smsCount = 50;
this.flow = 1*1024;
this.price = 78.0;
}
@Override
public void showInfo() {
System.out.println("超人套餐:通话时长为"+this.talkTime+"分钟/月,短信条数为"+this.smsCount+"条/月,上网流量为"+this.flow/1024+"GB/月。");
} /**
* 提供上网服务
*/
public int netPlay(int flow, MobileCard card) throws Exception {
int temp = flow;
for(int i=0;i<flow;i++){
if(this.flow-card.getRealFlow()>=1){
//第一种情况:套餐剩余流量可以支持使用1M流量
card.setRealFlow(card.getRealFlow()+1); //实际使用流量加1MB
}else if(card.getMoney()>=0.1){
//第二种情况:套餐流量已用完,账户余额可以支付1M流量,使用账户余额支付
card.setRealFlow(card.getRealFlow()+1); //实际使用流量加1MB
card.setMoney(Common.sub(card.getMoney(),0.1)); //账户余额消费0.1元(1M流量费用)
card.setConsumAmount(card.getConsumAmount() + 0.1);
}else{
temp = i;
throw new Exception("本次已使用流量"+i+"MB,您的余额不足,请充值后再使用!");
}
}
return temp;
} /**
* 提供通话服务
*/
public int call(int minCount, MobileCard card) throws Exception{
int temp = minCount;
for(int i=0;i<minCount;i++){
if(this.talkTime-card.getRealTalkTime()>=1){
//第一种情况:套餐剩余通话时长可以付1分钟通话
card.setRealTalkTime(card.getRealTalkTime()+1); //实际通话数据加1
}else if(card.getMoney()>=0.2){
//第二种情况:套餐通话时长已用完,账户余额可以支付1分钟通话,使用账户余额支付
card.setRealTalkTime(card.getRealTalkTime()+1); //实际使用通话时长1分钟
card.setMoney(Common.sub(card.getMoney(),0.2)); //账户余额消费0.2元(1分钟额外通话)
card.setConsumAmount(card.getConsumAmount() + 0.2);
}else{
temp = i; //记录实现通话分钟数
throw new Exception("本次已通话"+i+"分钟,您的余额不足,请充值后再使用!");
}
}
return temp;
} /**
* 提供短信服务
*/
public int sendMessage(int smsCount, MobileCard card) throws Exception {
int temp = smsCount;
for(int i=0;i<smsCount;i++){
if(this.smsCount-card.getRealSMSCount()>=1){
//第一种情况:套餐剩余短信条数可以付1条短信
card.setRealSMSCount(card.getRealSMSCount()+1); //实际使用短信条数加1
}else if(card.getMoney()>=0.1){
//第二种情况:套餐短信条数已用完,账户余额可以支付1条短信,使用账户余额支付
card.setRealSMSCount(card.getRealSMSCount()+1);
card.setMoney(Common.sub(card.getMoney(),0.1)); //账户余额消费0.1元(1条短信费用)
card.setConsumAmount(card.getConsumAmount() + 0.1);
}else{
temp = i;
throw new Exception("本次已发送短信"+i+"条,您的余额不足,请充值后再使用!");
}
}
return temp;
} }
package cn.soso.entity;
import cn.soso.common.Common;
import cn.soso.service.CallService;
import cn.soso.service.SendService; /**
* 话唠套餐
*
* @author yu
*
*/
public class TalkPackage extends ServicePackage implements CallService,
SendService {
private int talkTime; // 通话时长(分钟)
private int smsCount; // 短信条数(条) public int getTalkTime() {
return talkTime;
} public void setTalkTime(int talkTime) {
this.talkTime = talkTime;
} public int getSmsCount() {
return smsCount;
} public void setSmsCount(int smsCount) {
this.smsCount = smsCount;
} public TalkPackage() {
//套餐数据初始化
this.talkTime = 500;
this.smsCount = 30;
this.price = 58.0;
} public TalkPackage(int talkTime, int smsCount) {
super();
this.talkTime = talkTime;
this.smsCount = smsCount;
} /**
* 显示套餐详情
*/
public void showInfo() {
System.out.println("话唠套餐:通话时长为" + this.talkTime + "分钟/月,短信条数为"
+ this.smsCount + "条/月,资费为" + this.price + "元/月。");
} public int call(int minCount, MobileCard card) throws Exception{
int temp = minCount;
for(int i=0;i<minCount;i++){
if(this.talkTime-card.getRealTalkTime()>=1){
//第一种情况:套餐剩余通话时长可以付1分钟通话
card.setRealTalkTime(card.getRealTalkTime()+1); //实际使用流量加1MB
}else if(card.getMoney()>=0.2){
//第二种情况:套餐通话时长已用完,账户余额可以支付1分钟通话,使用账户余额支付
card.setRealTalkTime(card.getRealTalkTime()+1); //实际使用通话时长1分钟
card.setMoney(Common.sub(card.getMoney(),0.2)); //账户余额消费0.2元(1M流量费用)
card.setConsumAmount(card.getConsumAmount() + 0.2);
}else{
temp = i; //记录实现通话分钟数
throw new Exception("本次已通话"+i+"分钟,您的余额不足,请充值后再使用!");
}
}
return temp;
} public int sendMessage(int smsCount, MobileCard card) throws Exception {
int temp = smsCount;
for(int i=0;i<smsCount;i++){
if(this.smsCount-card.getRealSMSCount()>=1){
//第一种情况:套餐剩余短信条数可以付1条短信
card.setRealSMSCount(card.getRealSMSCount()+1); //实际使用短信条数加1
}else if(card.getMoney()>=0.1){
//第二种情况:套餐短信条数已用完,账户余额可以支付1条短信,使用账户余额支付
card.setRealSMSCount(card.getRealSMSCount()+1);
card.setMoney(Common.sub(card.getMoney(),0.1)); //账户余额消费0.1元(1条短信费用)
card.setConsumAmount(card.getConsumAmount() + 0.1);
}else{
temp = i;
throw new Exception("本次已发送短信"+i+"条,您的余额不足,请充值后再使用!");
}
}
return temp;
} }
  • 接口: 
package cn.soso.service;

import cn.soso.entity.MobileCard;

/**
* 通话服务接口
* @author yu
*
*/
public interface CallService {
//打电话
public int call(int minCount,MobileCard card) throws Exception;
}
package cn.soso.service;

import cn.soso.entity.MobileCard;

/**
* 上网服务
* @author yu
*
*/
public interface NetService {
//上网
public int netPlay(int flow,MobileCard card) throws Exception;
}
package cn.soso.service;

import cn.soso.entity.MobileCard;

/**
* 短信服务
* @author yu
*
*/
public interface SendService {
//发短信
public int sendMessage(int count,MobileCard card) throws Exception;
}
  • 工具类
package cn.soso.utils;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set; import cn.soso.common.Common;
import cn.soso.entity.ConsumInfo;
import cn.soso.entity.MobileCard;
import cn.soso.entity.NetPackage;
import cn.soso.entity.Scene;
import cn.soso.entity.ServicePackage;
import cn.soso.entity.SuperPackage;
import cn.soso.entity.TalkPackage;
import cn.soso.service.CallService;
import cn.soso.service.NetService;
import cn.soso.service.SendService; /**
* 手机卡工具类
*
* @author yu
*
*/
public class CardUtil {
Map<String, MobileCard> cards = new HashMap<String, MobileCard>(); // 所有手机卡的列表
Map<String, List<ConsumInfo>> consumInfos = new HashMap<String, List<ConsumInfo>>(); // 所有手机卡消费记录的列表
List<Scene> scenes = new ArrayList<Scene>(); // 初始化用户
public void init() {
MobileCard card1 = new MobileCard("何玲玲", "123", "13965756432",
new TalkPackage(), 58.0, 42.0);
MobileCard card2 = new MobileCard("黄露露", "123", "13956712467",
new NetPackage(), 68.0, 32.0);
MobileCard card3 = new MobileCard("朱蓉蓉", "123", "13911568956",
new SuperPackage(), 78.0, 22.0);
MobileCard card4 = new MobileCard("桃跑跑", "123", "13924221868",
new TalkPackage(), 78.0, 2.0);
card4.setConsumAmount(98.0);
card4.setRealTalkTime(500);
card4.setRealSMSCount(100);
cards.put("13965756432", card1);
cards.put("13956712467", card2);
cards.put("13911568956", card3);
cards.put("13924221868", card4);
} /**
* 使用场景初始化
*/
public void initScenes(){
scenes.add(new Scene("通话",90,"问候客户,谁知其如此难缠 通话90分钟"));
scenes.add(new Scene("通话",30,"询问妈妈身体状况 本地通话30分钟"));
scenes.add(new Scene("短信",5,"参与环境保护实施方案问卷调查 发送短信5条"));
scenes.add(new Scene("短信",50,"通知朋友手机换号,发送短信50条"));
scenes.add(new Scene("上网",1*1024,"和女友微信视频聊天 使用流量1G"));
scenes.add(new Scene("上网",2*1024,"晚上手机在线看韩剧,不留神睡着啦! 使用流量 2G"));
} /**
* 是否存在此卡用户 *
* @param number
* @param passWord
* @return
*/
public boolean isExistCard(String number, String passWord) {
Set<String> numbers = cards.keySet();
Iterator<String> it = numbers.iterator();
while (it.hasNext()) {
String searchNum = it.next();
if (searchNum.equals(number)
&& (cards.get(searchNum)).getPassWord().equals(passWord)) {
return true;
}
}
return false;
} /**
* 查找指定卡号是否已注册
*
* @param searchNumber
* @return 未注册:false 已注册:true
*/
public boolean isExistCard(String searchNumber) {
Set<String> numbers = cards.keySet();
for (String number : numbers) {
if (number.equals(searchNumber)) {
return true;
}
}
return false;
} /**
* 创建卡号(以139开头 11位)
*
* @return 生成的随机手机卡号
*/
public String createNumber() {
Random random = new Random();
boolean isExist = false; // 记录现有用户中是否存在此卡号用户 是:true 否:false
String number = "";
int temp = 0;
do {
isExist = false; // 标志位重置为false,用于控制外重循环,当生成了
// 生成的随机数是8位 不能小于10000000,否则重新生成
do {
temp = random.nextInt(100000000);
} while (temp < 10000000);
// 生成之前,前面加“139”
number = "139" + temp;
// 和现有用户的卡号比较,不能是重复
Set<String> cardNumbers = cards.keySet();
for (String cardNumber : cardNumbers) {
if (number.equals(cardNumber)) {
isExist = true;
break;
}
}
} while (isExist);
return number;
} /**
* 生成指定个数的新卡号列表
*
* @param count
* 指定个数
* @return 卡号列表
*/
public String[] getNewNumbers(int count) { String[] numbers = new String[count];
for (int i = 0; i < count; i++) {
numbers[i] = createNumber();
}
return numbers;
} /**
* 添加新卡
*
* @param card
* 新卡
*/
public void addCard(MobileCard card) {
cards.put(card.getCardNumber(), card);
System.out.print("注册成功!");
card.showMeg();
} /**
* 指定卡号办理退网
*
* @param card
*/
public void delCard(String delNumber) {
if (isExistCard(delNumber)) {
cards.remove(delNumber);
System.out.println("卡号" + delNumber + "办理退网成功!");
} else {
System.out.println("对不起,该卡号未注册,不能办退退网!");
}
} /**
* 查询指定卡套餐余量
*
* @param number
*/
public void showRemainDetail(String searchNumber) {
MobileCard card; // 要查询的卡
int remainTalkTime;
int remainSmsCount;
int remainFlow;
StringBuffer meg = new StringBuffer();
card = cards.get(searchNumber);
meg.append("您的卡号是" + searchNumber + ",套餐内剩余:\n");
ServicePackage pack = card.getSerPackage();
if (pack instanceof TalkPackage) {
//向下转型为话唠套餐对象
TalkPackage cardPack = (TalkPackage) pack;
// 话唠套餐,查询套餐内剩余的通话时长和短信条数
remainTalkTime = cardPack.getTalkTime() > card
.getRealTalkTime() ? cardPack.getTalkTime()
- card.getRealTalkTime() : 0;
meg.append("通话时长:" + remainTalkTime + "分钟\n");
remainSmsCount = cardPack.getSmsCount() > card
.getRealSMSCount() ? cardPack.getSmsCount()
- card.getRealSMSCount() : 0;
meg.append("短信条数:" + remainSmsCount + "条");
} else if (pack instanceof NetPackage) {
//向下转型为网虫套餐对象
NetPackage cardPack = (NetPackage) pack;
// 网虫套餐:查询套餐内剩余的上网流量
remainFlow = cardPack.getFlow() > card.getRealFlow() ? cardPack
.getFlow() - card.getRealFlow() : 0;
meg.append("上网流量:" + Common.dataFormat(remainFlow * 1.0 / 1024)
+ "GB");
} else if (pack instanceof SuperPackage) {
//向下转型为超人套餐对象
SuperPackage cardPack = (SuperPackage) pack;
// 超人套餐:查询套餐内剩余的通话时长、短信条数、上网流量
remainTalkTime = cardPack.getTalkTime() > card
.getRealTalkTime() ? cardPack.getTalkTime()
- card.getRealTalkTime() : 0;
meg.append("通话时长:" + remainTalkTime + "分钟\n");
remainSmsCount = cardPack.getSmsCount() > card
.getRealSMSCount() ? cardPack.getSmsCount()
- card.getRealSMSCount() : 0;
meg.append("短信条数:" + remainSmsCount + "条\n");
remainFlow = cardPack.getFlow() > card.getRealFlow() ? cardPack
.getFlow() - card.getRealFlow() : 0;
meg.append("上网流量:" + Common.dataFormat(remainFlow * 1.0 / 1024)
+ "GB");
}
System.out.println(meg);
} /**
* 查询指定卡当月消费详单
*
* @param searchNumber
*/
public void showAmountDetail(String searchNumber) {
MobileCard card; // 要查询的卡
StringBuffer meg = new StringBuffer();
card = cards.get(searchNumber);
meg.append("您的卡号:" + card.getCardNumber() + ",当月账单:\n");
meg.append("套餐资费:" + card.getSerPackage().getPrice() + "元\n");
meg.append("合计:" + Common.dataFormat(card.getConsumAmount()) + "元\n");
meg.append("账户余额:" + Common.dataFormat(card.getMoney()) + "元");
// 显示本月消费详细信息
System.out.println(meg);
} /**
* 指定卡号换套餐
*
* @param number
* @param packType
*/
public void changingPack(String number, String packNum) {
MobileCard card; // 指定的手机卡
ServicePackage pack; // 要换的套餐
if (isExistCard(number)) {
card = cards.get(number);
// 获取要换的套餐对象
switch (packNum) {
case "1":
pack = new TalkPackage();
break;
case "2":
pack = new NetPackage();
break;
default:
pack = new SuperPackage();
break;
}
if (!(card.getSerPackage().getClass().getName().equals(pack.getClass().getName()))) {
// 该卡余额中减去当月套餐资费
if (card.getMoney() >= pack.getPrice()) {
card.setMoney(card.getMoney() - pack.getPrice());
// 换套餐
card.setSerPackage(pack);
// 当月实际使用数据清零
card.setRealTalkTime(0);
card.setRealFlow(0);
card.setRealSMSCount(0);
// 当月消费金额设置为新套餐月资费
card.setConsumAmount(pack.getPrice());
System.out.print("更换套餐成功!");
pack.showInfo();
} else {
System.out.println("对不起,您的余额不足以支付新套餐本月资费,请充值后再办理更换套餐业务!");
return;
}
} else {
System.out.println("对不起,您已经是该套餐用户,无需换套餐!");
} } else {
System.out.println("对不起,该卡号未注册,不能换套餐!");
}
} /**
* 为指定手机卡充值
*
* @param number
* 指定充值的卡号
* @param money
* 充值金额
*/
public void chargeMoney(String number, double money) {
MobileCard card; // 指定的手机卡
if (money < 50) {
System.out.println("对不起,最低充值金额为50元!");
return;
}
card = cards.get(number);
card.setMoney(card.getMoney() + money);
System.out.println("充值成功,当前话费余额为" + Common.dataFormat(card.getMoney()) + "元。");
} /**
* 添加一条指定卡的消费记录
*
* @param number
* 要添加消费记录的卡
* @param info
* 要添加的消费记录
*/
public void addConsumInfo(String number, ConsumInfo info) {
Set<String> numbers = consumInfos.keySet();
Iterator<String> it = numbers.iterator();
List<ConsumInfo> infos = new ArrayList<ConsumInfo>();
boolean isExist = false; // 现有消费列表中是否存在此卡号消费记录,是:true 否:false
while (it.hasNext()) {
if (it.next().equals(number)) {
// 消费集合中已有该卡号消费记录,则找到该卡号的消费记录集合,添加一条即可
infos = consumInfos.get(number);
infos.add(info);
isExist = true;
System.out.println("已添加一条消费记录。");
break;
}
}
// 该集合中没有此卡号消费记录,则添加
if (!isExist) {
infos.add(info);
consumInfos.put(number, infos);
System.out.println("不存在此卡的消费记录,已添加一条消费记录。");
}
} //打印消费记录
public void printConsumInfo(String number){
Writer fileWriter = null;
try {
fileWriter = new FileWriter(number+"消费记录.txt");
Set<String> numbers = consumInfos.keySet();
Iterator<String> it = numbers.iterator();
List<ConsumInfo> infos = new ArrayList<ConsumInfo>();//存储指定卡所有消费记录
boolean isExist = false; // 现有消费列表中是否存在此卡号消费记录,是:true 否:false
while (it.hasNext()) {
if (it.next().equals(number)) {
infos = consumInfos.get(number);
isExist = true;
break;
}
}
if(isExist){
//存在 此卡消费记录,写入文本文件
StringBuffer content = new StringBuffer("******"+number+"消费记录******\n");
content.append("序号\t类型\t数据(通话(条)/上网(MB)/短信(条))\n");
for(int i=0;i<infos.size();i++){
ConsumInfo info = infos.get(i);
content.append((i+1)+".\t"+info.getType()+"\t"+info.getConsumData()+"\n");
}
fileWriter.write(content.toString());
fileWriter.flush(); System.out.println("消费记录打印完毕!");
}else{
System.out.println("对不起,不存在此号码的消费记录,不能打印!");
}
} catch (IOException e) {
e.printStackTrace();
}finally{
if(fileWriter!=null){
try {
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} /**
* 使用嗖嗖
* @param number 当前卡号
* @throws Exception
*/
public void userSoso(String number) {
MobileCard card = cards.get(number); // 获取此卡对象
ServicePackage pack = card.getSerPackage(); // 获取此卡所属套餐
Random random = new Random();
int ranNum = 0;
int temp = 0; //记录各场景中实际消费数据
do{ ranNum = random.nextInt(6);// 生成一个0~5之前的随机数
Scene scene = scenes.get(ranNum); //获取该序号所对应的场景
switch (ranNum) {
//序号为0或1为通话场景
case 0:
case 1:
// 判断该卡所属套餐是否支持通话功能
if (pack instanceof CallService) {
// 执行通话方法
System.out.println(scene.getDescription());
CallService callService = (CallService) pack;
try {
temp = callService.call(scene.getData(), card);
} catch (Exception e) {
e.printStackTrace();
}
// 添加一条消费记录
addConsumInfo(number, new ConsumInfo(number,
scene.getType(), temp));
break;
} else {
// 如果该卡套餐不支持通话功能,则重新生成随机数选择其他场景
continue;
}
//序号为2或3为发短信场景
case 2:
case 3:
// 判断该卡所属套餐是否支持短信功能
if (pack instanceof SendService) {
// 执行发短信方法
System.out.println(scene.getDescription());
SendService sendService = (SendService) pack;
try {
temp = sendService.sendMessage(scene.getData(), card);
} catch (Exception e) {
e.printStackTrace();
}
// 添加一条消费记录
addConsumInfo(number, new ConsumInfo(number,
scene.getType(), temp));
break;
} else {
// 如果该卡套餐不支持发短信功能,则重新生成随机数选择其他场景
continue;
}
//序号为4或5为发上网场景
case 4:
case 5:
// 判断该卡所属套餐是否支持上网功能
if (pack instanceof NetService) {
System.out.println(scene.getDescription());
NetService netService = (NetService) pack;
// 执行上网方法
try {
temp = netService.netPlay(scene.getData(), card);
} catch (Exception e) {
e.printStackTrace();
}
// 添加一条消费记录
addConsumInfo(number, new ConsumInfo(number,
scene.getType(), temp));
break;
} else {
// 如果该卡套餐不支持上网功能,则重新生成随机数选择其他场景
continue;
}
}
break;
}while(true);
} /**
* 根据套餐序号返回套餐对象
*
* @param packNum
* 套餐序号
* @return 套餐对象
*/
public ServicePackage createPack(int packId) {
ServicePackage pack = null;
switch (packId) {
case 1:
pack = new TalkPackage();
break;
case 2:
pack = new NetPackage();
break;
case 3:
pack = new SuperPackage();
break;
}
return pack;
} /**
* 显示资费说明
*/
public void showDescription(){
Reader rd = null;
try {
rd = new FileReader("套餐资费说明.txt");
char[] content = new char[1024];
int len = 0;
StringBuffer sb = new StringBuffer();
while((len=rd.read(content))!=-1){
sb.append(content,0,len); //拼接字符串
}
System.out.println(sb);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }

Java面向对象和高级特性 项目实战(一)的更多相关文章

  1. Java开发知识之Java类的高级特性,内部类.以及包使用.跟常量关键字

    Java开发知识之Java类的高级特性,内部类.以及包使用.跟常量关键字 一丶Java中包的机制 首先包其实就是个文件夹.作用就是管理类. Java中每次定义一个类的时候.通过Java编译之后.都会生 ...

  2. Python面向对象编程高级特性

    ***这里还是根据网上资料,主要是廖雪峰老师的教程学习的笔记,主要介绍python面向对象的高级特性,笔记不全,只是记录自己觉得容易出错的地方*** 1.python作为一种动态语言,他的动态绑定机制 ...

  3. 谈谈Java面向对象的三大特性

    Java面向对象的三大特性就是指封装.继承.多态了. 一.封装: 概念:封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式. (举例:笔记本电脑就是一个封装体,Java语言中最小的封装体就是函数 ...

  4. Java学习笔记二十五:Java面向对象的三大特性之多态

    Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...

  5. Java学习笔记二十一:Java面向对象的三大特性之继承

    Java面向对象的三大特性之继承 一:继承的概念: 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方 ...

  6. Java学习笔记十八:Java面向对象的三大特性之封装

    Java面向对象的三大特性之封装 一:面向对象的三大特性: 封装 继承 多态   二:封装的概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访 ...

  7. JAVA面向对象编程课程设计——项目部署

    目录 一.Java环境的安装 1.下载 2.安装 3.配置环境变量 二.Tomcat的安装 1.下载 2.安装 3.启动Tomcat(默认已经安装好java环境,如果未安装java会报错.) 三.My ...

  8. java面向对象的三大特性

    1.面向对象的三大特性 继承.封装.多态 什么是继承? ①继承是面向对象程序设计能够提高软件开发效率的重要原因之一. ②继承是具有传递性的,就像现实中孙子不仅长得像爸爸而且还像他爷爷. ③继承来的属性 ...

  9. Java 面向对象的三大特性之一 继承

    继承: Java是继承的三大特性之一,是Java中实现代码重用的手段之一 将重复的代码抽取到父类中继承的有点或者现实 优点: 方便修改代码 减少代码量 Java中继承的语法: 修饰符 SubClass ...

随机推荐

  1. clusterware启动顺序——CRSD

    CRSD层面 1.启动过程 )导致">CRSD无法启动集群的应用程序资源的可能原因有:"> 原因:/etc/oracle/ocr.loc指向了错误的OCR文件 [gri ...

  2. shell中脚本与函数的使用策略

    脚本:运行的副作用不影响父环境,开辟了fork子进程; 函数:副作用,定义的变量,数据默认直接添加到了调用者的环境,也是它自己的环境;不想副作用影响调用者环境,就必须主动用local修饰; shell ...

  3. mbstowcs 和ifstream 前为何要setlocale

    最近看公司的一些代码,发现一些地方调用了std::locale::global(locale("")); (c++) 和 setlocale(LC_ALL, "" ...

  4. python 第三方库 dateutil.parser 使用说明

    dateutil.parser 顾名思意 就是与日期相关库里的一个日期解析器 能够将字符串 转换为日期格式 我们来看看具体的用法 首先 需要在线安装 pip install python-dateut ...

  5. aqua data studio 连接db2

    打开datastudio 右键本地数据库服务器 →注册服务器打开以下界面: 1:选择版本号(我这里是window 9.7版本的db2) 2:名称 按照需要的写 3.登录名/密码 4.ip port 数 ...

  6. 2017-10-22模拟赛T2 或(or.*)

    题面 [题目描述]你需要构造一个长度为 n 的数列 X,当中的数字范围从 0 到 2^30-1.除此之外你需要满足 m 个条件,第 i 个条件为 X[li]|X[li+1]|……|X[ri]=pi.| ...

  7. RabbitMQ集群出现过机器故障,网络异常等故障后,重启无法重新建立集群的终极解决方案

    由于机器掉电,网络故障等原因,RabbitMQ整个集群出现问题.重启RabbitMQ时,发现某些机器始终无法重新加入到集群中,而且还可能出现网络分区. 针对不同情况,可能选择 rabbitmqctl ...

  8. Jmeter安装web socket协议插件

    jmeter本身不支持websocket协议,需要安装第三方插件才能支持 1. 首先需要第三方插件: JMeterWebSocketSampler-1.0.2-SNAPSHOT.jar 2. 该插件依 ...

  9. 【4】数独(Sudoku Killer)(深度优先遍历)

    问题描述:给你多个数独题目,让你输出答案 思路:递归确定每一个‘?’的位置的值,直到所有‘?’都被确定.先将原字符数组转换为整型数组,‘?’由数字0代替,然后每一次层递归找到第一个0的位置,如果找到了 ...

  10. 字符串与NUll的拼接问题

    今天做项目,浏览器向后台传值的时候,碰到一个问题,声明变量的时候为null时,首次加载会报错.但是初始化一次后,就正常传值了,摸索了半天,终于找到问题所在.在此记录一下,谨记. 现在说说情况,我在JS ...