1。接口 通话服务

package Soso;

// 接口 通话服务

    public interface CallService {

    public abstract int call(int minCount, MobileCard card) throws Exception;
}

2.公共类

public class Common {

    // 实例化话唠套餐
static TalkPackage talkPackage = new TalkPackage(, , );
// 实例化网虫套餐
static NetPackage netPackage = new NetPackage(, * );
// 实例化超人套餐
static SuperPackage superPackage = new SuperPackage(, , , * );
}

3.消费信息类

//消费信息类

public class ConsumInfo {
private String cardNumber; // 卡号
private String type; // 消费类型
private int consumData; // 消费数据 public ConsumInfo() {
super();
} 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;
} }

4.嗖嗖移动卡类

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() {
super();
} public MobileCard(String cardNumber, String userName, String passWord, ServicePackage serPackage,
double consumAmount, double money, int realTalkTime, int realSMSCount, int realFlow) {
super();
this.cardNumber = cardNumber;
this.userName = userName;
this.passWord = passWord;
this.serPackage = serPackage;
this.consumAmount = consumAmount;
this.money = money;
this.realTalkTime = realTalkTime;
this.realSMSCount = realSMSCount;
this.realFlow = realFlow;
} public String getCardNumber() {
return cardNumber;
} public void setCardNumber(String cardNumber) {
this.cardNumber = cardNumber;
} 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 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() { }

5.话痨套餐

//话唠套餐
public class NetPackage extends ServicePackage implements NetService {
private int flow; // 上网流量 public NetPackage() {
super();
} public NetPackage(double price, int flow) {
super(price);
this.flow = flow;
} public int getFlow() {
return flow;
} public void setFlow(int flow) {
this.flow = flow;
} @Override
// 返回使用流量数
public int netPlay(int flow, MobileCard card) throws Exception {
int temp = flow;
for (int i = ; i < flow; i++) {
if (this.flow - card.getRealFlow() >= ) {
// 第一种情况:流量剩余够 1 MB
card.setRealFlow(card.getRealFlow() + );
} else if (card.getMoney() >= 0.1) {
// 第二种情况:套餐内流量已经用完,剩下话费够支付 1 MB的流量
card.setRealFlow(card.getRealFlow() + ); // 实际短信数加 1 条
// 账户余额消费0.1元,(1MB流量)
card.setMoney(card.getMoney() - 0.1);
card.setConsumAmount(card.getConsumAmount() + 0.1); // 当月消费金额 +
// 0.1
} else {
temp = i; // 记录使用流量多少MB
throw new Exception("流量已经使用" + i + "MB,您的余额不足,请充值后再使用!");
// System.err.println("流量已经使用" + i + "MB,您的余额不足,请充值后再使用!");
}
}
return temp;
} @Override
public void showInfo() {
System.out.println("网虫套餐:上网流量为:" + (this.flow * 1.0 / ) + "GB/月," + "资费为:" + super.getPrice() + "元/月");
}

6.接口 上网服务

public interface NetService {
public abstract int netPlay(int flow, MobileCard card) throws Exception;
}

7.使用场景类

public class Scene {
private String type; // 场景类型
private int data; // 场景消费数据
private String description; // 场景描述 public Scene() {
super();
} public Scene(String type, int data, String description) {
super();
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;
} }

8.接口 短信服务

public interface SendService {
public abstract int send(int count, MobileCard card) throws Exception;
}

9. 资费套餐类 ,是话唠、网虫、超人套餐的父类

public abstract class ServicePackage {
private double price; // 月资费 public double getPrice() {
return price;
} public void setPrice(double price) {
this.price = price;
} public ServicePackage() {
super();
// TODO Auto-generated constructor stub
} public ServicePackage(double price) {
super();
this.price = price;
} public abstract void showInfo(); }

10.

public class SuperPackage extends ServicePackage implements SendService, NetService, CallService {
private int talkTime; // 通话时长
private int smsCount; // 短信条数
private int flow; // 上网流量
private int price = ;//价格 public SuperPackage() {
super();
} public SuperPackage(double price, int talkTime, int smsCount, int flow) {
super(price);
this.talkTime = talkTime;
this.smsCount = smsCount;
this.flow = flow;
} 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;
} @Override
// 返回通话时长
public int call(int minCount, MobileCard card) throws Exception {
int temp = minCount;
for (int i = ; i < minCount; i++) {
if (this.talkTime - card.getRealTalkTime() >= ) {
// 第一种情况:套餐剩余通话时长可以支持1分钟通话
card.setRealTalkTime(card.getRealTalkTime() + );
} else if (card.getMoney() >= 0.2) {
// 第二种情况:套餐通话时长已用完,账户余额可以支付1分钟通话,使用账户余额支付
card.setRealTalkTime(card.getRealTalkTime() + ); // 实际使用通话时长1分钟
// 账户余额消费0.2元(1分钟 额外通话)
card.setMoney(card.getMoney() - 0.2);
card.setConsumAmount(card.getConsumAmount() + 0.2); // 当月消费金额 +
// 0.2
} else {
temp = i; // 记录实际通话分钟数
throw new Exception("本次已经通话" + i + "分钟,您的余额不足,请充值后再使用!");
// System.err.println("本次已经通话" + i + "分钟,您的余额不足,请充值后再使用!");
}
}
return temp;
} @Override
// 返回使用流量数
public int netPlay(int flow, MobileCard card) throws Exception {
int temp = flow;
for (int i = ; i < flow; i++) {
if (this.flow - card.getRealFlow() >= ) {
// 第一种情况:流量剩余够 1 MB
card.setRealFlow(card.getRealFlow() + );
} else if (card.getMoney() >= 0.1) {
// 第二种情况:套餐内流量已经用完,剩下话费够支付 1 MB的流量
card.setRealFlow(card.getRealFlow() + ); // 实际短信数加 1 条
// 账户余额消费0.1元,(1MB流量)
card.setMoney(card.getMoney() - 0.1);
card.setConsumAmount(card.getConsumAmount() + 0.1); // 当月消费金额 +
// 0.1
} else {
temp = i; // 记录使用流量多少MB
throw new Exception("流量已经使用" + i + "MB,您的余额不足,请充值后再使用!");
}
}
return temp;
} @Override
// 返回实际发送短信条数
public int send(int count, MobileCard card) throws Exception {
int temp = count;
for (int i = ; i < count; i++) {
if (this.smsCount - card.getRealSMSCount() >= ) {
// 第一种情况:套餐剩余短信数能够发送一个短信
card.setRealSMSCount(card.getRealSMSCount() + );
} else if (card.getMoney() >= 0.1) {
// 第二种情况:套餐内短信已经用完,剩下话费能够允许发一条短信
card.setRealSMSCount(card.getRealSMSCount() + ); // 实际短信数加 1 条
// 账户余额消费0.1元,(一条短信)
card.setMoney(card.getMoney() - 0.1);
card.setConsumAmount(card.getConsumAmount() + 0.1); // 当月消费金额 +
// 0.1
} else {
temp = i; // 记录发短信条数
throw new Exception("短信已经发送" + i + "条,您的余额不足,请充值后再使用!");
}
}
return temp;
} @Override
public void showInfo() {
System.out.println("超人套餐:通话时长为:" + this.talkTime + "分钟/月," + "短信条数为:" + this.smsCount + "条/每月," + "上网流量为:"
+ (this.flow * 1.0 / ) + "GB/月," + "资费为:" + super.getPrice() + "元/月");
}

11

public class TalkPackage extends ServicePackage implements CallService, SendService {
private int talkTime;// 通话时长
private int smsCount;// 短信条数 public TalkPackage() {
super();
} public TalkPackage(double price, int talkTime, int smsCount) {
super(price);
this.talkTime = talkTime;
this.smsCount = 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;
} @Override
// 返回通话时长
public int call(int minCount, MobileCard card) throws Exception {
int temp = minCount;
for (int i = ; i < minCount; i++) {
if (this.talkTime - card.getRealTalkTime() >= ) {
// 第一种情况:套餐剩余通话时长可以支持1分钟通话
card.setRealTalkTime(card.getRealTalkTime() + );
} else if (card.getMoney() >= 0.2) {
// 第二种情况:套餐通话时长已用完,账户余额可以支付1分钟通话,使用账户余额支付
card.setRealTalkTime(card.getRealTalkTime() + ); // 实际使用通话时长1分钟
// 账户余额消费0.2元(1分钟 额外通话)
card.setMoney(card.getMoney() - 0.2);
card.setConsumAmount(card.getConsumAmount() + 0.2); // 当月消费金额 +
// 0.2
} else {
temp = i; // 记录实际通话分钟数
throw new Exception("本次已经通话" + i + "分钟,您的余额不足,请充值后再使用!");
}
}
return temp;
} @Override
// 返回实际发送短信条数
public int send(int count, MobileCard card) throws Exception {
int temp = count;
for (int i = ; i < count; i++) {
if (this.smsCount - card.getRealSMSCount() >= ) {
// 第一种情况:套餐剩余短信数能够发送一个短信
card.setRealSMSCount(card.getRealSMSCount() + );
} else if (card.getMoney() >= 0.1) {
// 第二种情况:套餐内短信已经用完,剩下话费能够允许发一条短信
card.setRealSMSCount(card.getRealSMSCount() + ); // 实际短信数加 1 条
// 账户余额消费0.1元,(一条短信)
card.setMoney(card.getMoney() - 0.1);
card.setConsumAmount(card.getConsumAmount() + 0.1); // 当月消费金额 +
// 0.1
} else {
temp = i; // 记录发短信条数
throw new Exception("短信已经发送" + i + "条,您的余额不足,请充值后再使用!");
// System.err.println("短信已经发送" + i + "条,您的余额不足,请充值后再使用!");
}
}
return temp;
} @Override
public void showInfo() {
System.out.println(
"话唠套餐:通话时长为:" + this.talkTime + "分钟/月,短信条数为:" + this.smsCount + "条/月,资费为:" + super.getPrice() + "元/月");
} }

12

package Soso;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
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.Scanner;
import java.util.Set; //工具类 public class CardUtil { protected static Map<String, MobileCard> cards = new HashMap<String, MobileCard>(); // 已注册嗖嗖移动用户列表 protected static Map<String, List<ConsumInfo>> consumInfos = new HashMap<String, List<ConsumInfo>>(); // 所有卡号的消费记录列表 protected static Map<Integer, Scene> scenes = new HashMap<Integer, Scene>();// 使用场景列表 protected static Scene scene0 = new Scene("通话", , "把领导骂了一顿非常过瘾,通话90分钟");
protected static Scene scene1 = new Scene("通话", , "打电话给金沂,通话30分钟");
protected static Scene scene2 = new Scene("短信", , "没事闲的发短信玩,发送短信5条");
protected static Scene scene3 = new Scene("短信", , "通知朋友手机换号,发送短信50条");
protected static Scene scene4 = new Scene("上网", , "晚上偷看小视频,使用流量1GB");
protected static Scene scene5 = new Scene("上网", * , "晚上偷看小视频,不留神睡着啦!使用2GB");
protected static Scanner input = new Scanner(System.in); public CardUtil() {
super();
} // 注册新卡
public static void addCard(MobileCard card) {
cards.put(card.getCardNumber(), card);
} // 话费充值
public static void chargeMoney(String number) {
System.out.println("请输入要充值的金额(不少于50元):");
while (true) {
double money = 0.0;
while (true) {
Scanner input = new Scanner(System.in);
if (input.hasNextDouble() == true) {
money = input.nextDouble();
break;
} else {
System.out.print("输入错误!请重新输入:"); }
}
if (money < ) {
System.out.println("输入金额少于50元请重新输入:");
continue;
} else {
cards.get(number).setMoney(cards.get(number).getMoney() + money);
System.out.println("充值成功,当前话费余额为" + dataFormat(cards.get(number).getMoney()));
break;
}
} } // 使用嗖嗖
public static void userSoso(String number) {
// 添加场景Map集合的键值对
scenes.put(, scene0);
scenes.put(, scene1);
scenes.put(, scene2);
scenes.put(, scene3);
scenes.put(, scene4);
scenes.put(, scene5); MobileCard card = cards.get(number); // 获取此卡对象
ServicePackage pack = card.getSerPackage(); // 获取此卡所属套餐
Random random = new Random();
int ranNum = ;
int temp = ; // 记录各场景中的实际消费数据
do {
ranNum = random.nextInt();
Scene scene = scenes.get(ranNum); // 获取该序号所有对应的场景
switch (ranNum) {
case :
case :
// 序号为0或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;
}
case :
case :
// 序号2或3发短信场景
// 获取该卡所属套餐是否支持短信
if (pack instanceof SendService) {
// 执行短信方法
System.out.println(scene.getDescription());
SendService sendService = (SendService) pack;
try {
temp = sendService.send(scene.getData(), card);
} catch (Exception e) {
e.printStackTrace();
}
// 添加一条消费记录
addConsumInfo(number, new ConsumInfo(number, scene.getType(), temp));
break;
} else {
// 如果该卡套餐不支持短信功能,则重新生成随机数选择其他场景
continue;
}
case :
case :
// 获取该卡所属套餐是否支持上网
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);
} // 资费说明
public static void showDescription() {
FileReader fr = null;
BufferedReader br = null;
try {
// 创建一个FileReader对象
fr = new FileReader("e:/套餐资费说明.txt");
// 创建一个BufferedReader对象
br = new BufferedReader(fr);
// 读取一行数据
String line = null; while ((line = br.readLine()) != null) { System.out.println(line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null) {
br.close();
}
if (fr != null) {
fr.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
} // 本月账单查询
public static void showAmountDetail(String number) {
MobileCard mobileCard = cards.get(number);
System.out.println("您的卡号为:" + mobileCard.getCardNumber());
System.out.println("当月账单如下:");
System.out.println("套餐资费:" + dataFormat(mobileCard.getSerPackage().getPrice()) + "元" + "\t合计消费:"
+ dataFormat(mobileCard.getConsumAmount()) + "元" + "\t账户余额:" + dataFormat(mobileCard.getMoney()) + "元");
} // 套餐余量查询
public static void showRemainDetail(String searchNumber) {
MobileCard mobileCard = cards.get(searchNumber);
int remainTalkTime;
int remainSmsCount;
int remainFlow;
StringBuffer meg = new StringBuffer();
meg.append("您的卡号是" + searchNumber + ",套餐内剩余:\n");
ServicePackage pack = mobileCard.getSerPackage();
if (pack instanceof TalkPackage) {
// 向下转型为话唠对象
TalkPackage cardPack = (TalkPackage) pack;
// 话唠套餐,查询套餐内剩余的通话时长和短信数
remainTalkTime = cardPack.getTalkTime() > mobileCard.getRealTalkTime()
? cardPack.getTalkTime() - mobileCard.getRealTalkTime() : ;
meg.append("通话时长:" + remainTalkTime + "分钟\n");
remainSmsCount = cardPack.getSmsCount() > mobileCard.getRealSMSCount()
? cardPack.getSmsCount() - mobileCard.getRealSMSCount() : ;
meg.append("短信条数:" + remainSmsCount + "条");
} else if (pack instanceof NetPackage) {
// 向下转型为网虫对象
NetPackage cardPack = (NetPackage) pack;
// 网虫套餐查询上网流量
remainFlow = cardPack.getFlow() > mobileCard.getRealFlow() ? cardPack.getFlow() - mobileCard.getRealFlow()
: ;
meg.append("上网流量:" + dataFormat(remainFlow * 1.0 / ) + "GB");
} else if (pack instanceof SuperPackage) {
// 向下转型为超人对象
SuperPackage cardPack = (SuperPackage) pack;
// 超人套餐查询通话时长、上网流量、短信条数。
remainTalkTime = cardPack.getTalkTime() > mobileCard.getRealTalkTime()
? cardPack.getTalkTime() - mobileCard.getRealTalkTime() : ;
meg.append("通话时长:" + remainTalkTime + "分钟\n");
remainFlow = cardPack.getFlow() > mobileCard.getRealFlow() ? cardPack.getFlow() - mobileCard.getRealFlow()
: ;
meg.append("上网流量:" + dataFormat(remainFlow * 1.0 / ) + "GB");
remainSmsCount = cardPack.getSmsCount() > mobileCard.getRealSMSCount()
? cardPack.getSmsCount() - mobileCard.getRealSMSCount() : ;
meg.append("短信条数:" + remainSmsCount + "条");
}
System.out.println(meg); } // 打印消费详单
public static void printAmountDetail(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>();
infos = consumInfos.get(number);
// 存储指定卡的所有消费记录
// 现有消费列表中是否存在此卡号的消费记录,是:true 否:false
boolean isExist = false;
while (it.hasNext()) {
String numberKey = it.next();
if (number.equals(numberKey)) {
isExist = true;
}
}
if (isExist) {
StringBuffer content = new StringBuffer("***********" + number + "消费记录************\n");
content.append("序号\t类型\t数据(通话(分钟)/上网(MB)/短信(条))\n");
for (int i = ; i < infos.size(); i++) {
ConsumInfo info = infos.get(i);
content.append((i + ) + ".\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 {
try {
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} // 套餐变更
public static void changingPack(String number) {
System.out.println("1.话唠套餐 2.网虫套餐 3.超人套餐 :请选择(序号):");
int packNum = input.nextInt();
switch (packNum) {
case : // 选择变更的套餐为话唠套餐
if (cards.get(number).getSerPackage() instanceof TalkPackage) {
System.out.println("对不起,您已经是该套餐用户,无需换套餐!");
} else {
if (cards.get(number).getMoney() < cards.get(number).getSerPackage().getPrice()) {// 如果剩余费用不够支持新的套餐费用 System.out.println("对不起,您的的余额不足以支付新的套餐本月资费,请充值后再办理业务!"); } else { cards.get(number).setRealSMSCount();
cards.get(number).setRealTalkTime();
cards.get(number).setRealFlow();
cards.get(number).setSerPackage(Common.talkPackage);
System.out.println("套餐更换成功!");
Common.talkPackage.showInfo(); }
} break; case : // 选择变更的套餐为网虫套餐
if (cards.get(number).getSerPackage() instanceof NetPackage) {
System.out.println("对不起,您已经是该套餐用户,无需换套餐!");
} else {
if (cards.get(number).getMoney() < cards.get(number).getSerPackage().getPrice()) {// 如果剩余费用不够支持新的套餐费用
System.out.println("对不起,您的的余额不足以支付新的套餐本月资费,请充值后再办理业务!");
} else {
cards.get(number).setRealSMSCount();
cards.get(number).setRealTalkTime();
cards.get(number).setRealFlow();
cards.get(number).setSerPackage(Common.netPackage);
System.out.println("套餐更换成功!");
Common.netPackage.showInfo(); }
} break; case :// 选择变更的套餐为超人套餐
if (cards.get(number).getSerPackage() instanceof SuperPackage) {
System.out.println("对不起,您已经是该套餐用户,无需换套餐!");
} else {
if (cards.get(number).getMoney() < cards.get(number).getSerPackage().getPrice()) {// 如果剩余费用不够支持新的套餐费用
System.out.println("对不起,您的的余额不足以支付新的套餐本月资费,请充值后再办理业务!");
} else {
cards.get(number).setRealSMSCount();
cards.get(number).setRealTalkTime();
cards.get(number).setRealFlow();
cards.get(number).setSerPackage(Common.superPackage);
System.out.println("套餐更换成功!");
Common.superPackage.showInfo(); }
}
break;
}
} // 办理退网
public static void delCard(String number) {
Set<String> numberKeys = cards.keySet();
Iterator<String> it = numberKeys.iterator();
while (it.hasNext()) {
String numberKey = it.next();
if (numberKey.equals(number)) {
cards.remove(numberKey);
// 下面这这句话可能会报异常标记*
System.out.println("卡号" + number + "办理退网成功\n谢谢使用!");
} else {
System.out.println("办理退卡失败!");
}
}
} // 根据卡号和密码验证该卡是否注册
public static boolean isExistCard(String number, String passWord) {
if (cards.size() != ) {
Set<String> numberKeys = cards.keySet();
// System.out.println(numberKeys);
Iterator<String> its = numberKeys.iterator();
while (its.hasNext()) {
String numberKey = its.next();
MobileCard mobileCard = cards.get(numberKey); // 根据key取出对应的值
if (number.trim().equals(numberKey.trim()) && passWord.trim().equals(mobileCard.getPassWord().trim())) {
System.out.println("该用户存在,且帐号密码都正确");
return true;
} else if (number.trim().equals(numberKey.trim()) == true
&& passWord.trim().equals(mobileCard.getPassWord().trim()) == false) {
System.out.println("该用户存在,但密码错误");
return false;
} }
System.out.println("该用户不存在");
return false;
} else {
System.out.println("cards集合为空,不存在用户!");
return false;
} } // 根据卡号验证该卡号是否注册
public static boolean isExistCard(String number) {
if (cards.size() != ) {
Set<String> numberKeys = cards.keySet();
Iterator<String> its = numberKeys.iterator();
while (its.hasNext()) {
if (number.equals(its.next())) {
// System.out.println("该用户已经注册!");
return true;
} }
System.out.println("该用户不存在!");
return false;
} else {
System.out.println("cards集合为空,不存在用户!");
return false;
}
} // 生成随机卡号
public static String createNumber() {
Random random = new Random();
// 记录现有用户中是否存在此卡号用户 是:true 否:false
boolean isExist = false;
String number = "";
int temp = ;
do {
isExist = false;// 标志位重置为false,用于控制外重循环
// 生成的随机数是8位,不能小于10000000,否则重新生成
// 回头重写这段代码,执行效率太低
do {
temp = random.nextInt();
} while (temp < );
// 生成之前,前面加“139”
number = "" + temp;
// 和现有用户的卡号比较,不能是重复的
if (cards != null) { // 价格判断 否则 下方的一句会报空指针异常
Set<String> cardNumbers = cards.keySet();
for (String cardNumber : cardNumbers) {
if (number.equals(cardNumber)) {
isExist = true;
break;
}
}
} } while (isExist);
return number;
} // 生成指定个数的卡号列表 (回头尝试是否可以通过返回集合列表的方式显示)
public static String[] getNewNumbers(int count) {
String[] strs = new String[count];
for (int i = ; i < count; i++) {
strs[i] = createNumber(); // 通过随机生成给strs[i]赋值
}
return strs;
} // 添加指定卡号的消费记录
public static void addConsumInfo(String number, ConsumInfo info) {
if (consumInfos.containsKey(number)) {
consumInfos.get(number).add(info);
} else {
List<ConsumInfo> list = new ArrayList<ConsumInfo>();
list.add(info);
consumInfos.put(number, list);
}
} // 将double数据格式化输出
public static String dataFormat(double data) {
DecimalFormat formatData = new DecimalFormat("#0.0");
return formatData.format(data);
}
}

13

package Soso;

// 超人套餐类

public class SuperPackage extends ServicePackage implements SendService, NetService, CallService {
private int talkTime; // 通话时长
private int smsCount; // 短信条数
private int flow; // 上网流量
private int price = ;//价格 public SuperPackage() {
super();
} public SuperPackage(double price, int talkTime, int smsCount, int flow) {
super(price);
this.talkTime = talkTime;
this.smsCount = smsCount;
this.flow = flow;
} 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;
} @Override
// 返回通话时长
public int call(int minCount, MobileCard card) throws Exception {
int temp = minCount;
for (int i = ; i < minCount; i++) {
if (this.talkTime - card.getRealTalkTime() >= ) {
// 第一种情况:套餐剩余通话时长可以支持1分钟通话
card.setRealTalkTime(card.getRealTalkTime() + );
} else if (card.getMoney() >= 0.2) {
// 第二种情况:套餐通话时长已用完,账户余额可以支付1分钟通话,使用账户余额支付
card.setRealTalkTime(card.getRealTalkTime() + ); // 实际使用通话时长1分钟
// 账户余额消费0.2元(1分钟 额外通话)
card.setMoney(card.getMoney() - 0.2);
card.setConsumAmount(card.getConsumAmount() + 0.2); // 当月消费金额 +
// 0.2
} else {
temp = i; // 记录实际通话分钟数
throw new Exception("本次已经通话" + i + "分钟,您的余额不足,请充值后再使用!");
// System.err.println("本次已经通话" + i + "分钟,您的余额不足,请充值后再使用!");
}
}
return temp;
} @Override
// 返回使用流量数
public int netPlay(int flow, MobileCard card) throws Exception {
int temp = flow;
for (int i = ; i < flow; i++) {
if (this.flow - card.getRealFlow() >= ) {
// 第一种情况:流量剩余够 1 MB
card.setRealFlow(card.getRealFlow() + );
} else if (card.getMoney() >= 0.1) {
// 第二种情况:套餐内流量已经用完,剩下话费够支付 1 MB的流量
card.setRealFlow(card.getRealFlow() + ); // 实际短信数加 1 条
// 账户余额消费0.1元,(1MB流量)
card.setMoney(card.getMoney() - 0.1);
card.setConsumAmount(card.getConsumAmount() + 0.1); // 当月消费金额 +
// 0.1
} else {
temp = i; // 记录使用流量多少MB
throw new Exception("流量已经使用" + i + "MB,您的余额不足,请充值后再使用!");
}
}
return temp;
} @Override
// 返回实际发送短信条数
public int send(int count, MobileCard card) throws Exception {
int temp = count;
for (int i = ; i < count; i++) {
if (this.smsCount - card.getRealSMSCount() >= ) {
// 第一种情况:套餐剩余短信数能够发送一个短信
card.setRealSMSCount(card.getRealSMSCount() + );
} else if (card.getMoney() >= 0.1) {
// 第二种情况:套餐内短信已经用完,剩下话费能够允许发一条短信
card.setRealSMSCount(card.getRealSMSCount() + ); // 实际短信数加 1 条
// 账户余额消费0.1元,(一条短信)
card.setMoney(card.getMoney() - 0.1);
card.setConsumAmount(card.getConsumAmount() + 0.1); // 当月消费金额 +
// 0.1
} else {
temp = i; // 记录发短信条数
throw new Exception("短信已经发送" + i + "条,您的余额不足,请充值后再使用!");
}
}
return temp;
} @Override
public void showInfo() {
System.out.println("超人套餐:通话时长为:" + this.talkTime + "分钟/月," + "短信条数为:" + this.smsCount + "条/每月," + "上网流量为:"
+ (this.flow * 1.0 / ) + "GB/月," + "资费为:" + super.getPrice() + "元/月");
}
}

Soso(嗖嗖)移动 java 项目的更多相关文章

  1. eclipse — 导入android项目后识别成java项目的问题及解决

    最近在eclipse导入android项目的时候遇到了奇葩问题,再此记录 遇到的问题就是:将完好的android项目导入到eclipse的时候,原本这是一个很容易的事情,但是导入成功后发现,,,靠ec ...

  2. owner:轻松管理java项目配置

    前段时间,一同事说在 github 上“活捉了”一个很有趣的开源项目,它是一个超轻量级的 jar 包,能够帮助你在 java 项目中摒弃样板式的 properties 配置代码,让你轻松自如地管理和使 ...

  3. Scala:Java 项目中混入scala代码

    Spark 是用Scala代码写的.为了调试Spark,做了如下尝试. 1.Eclipse下:Java 项目 ,Using Maven,编写了一个java 版Spark应用. Spark的代码(sca ...

  4. 将 java 项目打包成可运行的 jar 包(main 函数带参数),并上传到 linux 服务器上运行

    一.概述 java项目有两种架构,一种是 B/S 架构的,一种是 C/S 架构的. 对于 B/S 架构来说,我们常见的 java ee 即是 B/S 架构,通常,开发人员会在本地进行开发,然后将项目打 ...

  5. Java开发程序,使用编辑器编写创建Java项目、类

    打开Eclipse 出现界面 工作空间的路径可以选择一个大空间的磁盘存放,点击确定: 创建:程序左上角-文件-新建-JAVA项目 输入项目名(项目名不能为中文),点击完成: 在   包资源管理器中点击 ...

  6. Java开发环境的搭建以及使用eclipse从头一步步创建java项目

    一.java 开发环境的搭建 这里主要说的是在windows 环境下怎么配置环境. 1.首先安装JDK java的sdk简称JDK ,去其官方网站下载最近的JDK即可..http://www.orac ...

  7. eclipse java项目中明明引入了jar包 为什么项目启动的时候不能找到jar包 项目中已经 引入了 com.branchitech.app 包 ,但时tomcat启动的时候还是报错? java.lang.ClassNotFoundException: com.branchitech.app.startup.AppStartupContextListener java.lang.ClassN

    eclipse java项目中明明引入了jar包 为什么项目启动的时候不能找到jar包 项目中已经 引入了 com.branchitech.app 包 ,但时tomcat启动的时候还是报错?java. ...

  8. 像Maven一样构建java项目的目录,更好的管理java工程的源码

    都知道maven具有管理Java或者Javaweb的功能.我个人尤其看中的是其代码层次的分离.不同的代码在不同的文件夹下.这是在eclipse新建一个普通的工程无法实现的.而如果用maven实现有时候 ...

  9. eclipse中 将java项目转换为web项目

    来自:http://jadethao.iteye.com/blog/1331308 eclipse中 将java项目转换为web项目 1.找到项目工作空间目录,打开.project文件,并修改文件,  ...

随机推荐

  1. nice-validator表单验证插件的简单使用

    前言 前端表单校验是过滤无效数据.假数据.有毒数据的第一步,是数据安全的第一道关卡,虽然我们不能100%相信客户端提交的数据(真正的校验还得在服务端进行),但设置前端表单校验也是至关重要的,自己写逻辑 ...

  2. Application生命周期(一)

    1.Application是什么? Application和Activity,Service一样,是android框架的一个系统组件,当android程序启动时系统会创建一个 application对 ...

  3. Netty源码分析--Reactor模型(二)

    这一节和我一起开始正式的去研究Netty源码.在研究之前,我想先介绍一下Reactor模型. 我先分享两篇文献,大家可以自行下载学习.  链接:https://pan.baidu.com/s/1Uty ...

  4. Netty源码分析--Channel注册(上)(五)

    其实在将这一节之前,我们来分析一个东西,方便下面的工作好开展. 打开启动类,最开始的时候创建了一个NioEventLoopGroup 事件循环组,我们来跟一下这个. 这里bossGroup, 我传入了 ...

  5. Android短视频中如何实现720P磨皮美颜录制?

    视频中磨皮.美颜功能已成为刚需,那么如何在Android短视频中实现720P磨皮美颜录制?本篇文章中,网易云信资深开发工程师将向大家介绍具体的操作方法. 相关阅读推荐 <短视频技术详解:Andr ...

  6. (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例

    原生js实现放烟花效果,点击鼠标,然后随机向四周扩散,! 思路: 1.首先烟花是五颜六色的,所以我们先写一个随机颜色的函数: 2.创建一个制造烟花的构造函数,第一个参数为元素,第二参数为初始x轴位置, ...

  7. 【设计模式】行为型04迭代器模式(Iterator Pattern)

    学习地址:http://www.runoob.com/design-pattern/iterator-pattern.html 迭代器模式,简单来说就是通过迭代的方式对集合进行遍历,在集合的学习中也一 ...

  8. java常用基础(一)

    Java常用基础(一) 原文写于2017-12-02 输入输出 //输入 Scanner in = new Scanner(new BufferedInputStream(System.in)); i ...

  9. leetcode的Hot100系列--461. 汉明距离

    求两个数的二进制位不同的位置,最先想到的就是异或操作, 异或:按位运算,相同为0,不同为1. 比如: a = 6 对应的二进制表示为: 0 0 1 1 1 ​ b = 9 对应的二进制表示为: 0 1 ...

  10. 小代学Spring Boot之开篇

    想要获取更多文章可以访问我的博客 - 代码无止境. 前情提要 小代是一名入职不久的程序员,公司同事都亲切的称他小代.有一天小代的老大陈BOSS和小代说,公司后端最近准备换技术框架了. 小代: 换成啥? ...