Soso(嗖嗖)移动 java 项目

时间:2024-03-10 15:22:33

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(58, 500, 30);
    // 实例化网虫套餐
    static NetPackage netPackage = new NetPackage(68, 3 * 1024);
    // 实例化超人套餐
    static SuperPackage superPackage = new SuperPackage(78, 200, 50, 1 * 1024);
}

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 = 0; i < flow; i++) {
            if (this.flow - card.getRealFlow() >= 1) {
                // 第一种情况:流量剩余够 1 MB
                card.setRealFlow(card.getRealFlow() + 1);
            } else if (card.getMoney() >= 0.1) {
                // 第二种情况:套餐内流量已经用完,剩下话费够支付 1 MB的流量
                card.setRealFlow(card.getRealFlow() + 1); // 实际短信数加 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 / 1024) + "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 = 78;//价格

    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 = 0; i < minCount; i++) {
            if (this.talkTime - card.getRealTalkTime() >= 1) {
                // 第一种情况:套餐剩余通话时长可以支持1分钟通话
                card.setRealTalkTime(card.getRealTalkTime() + 1);
            } else if (card.getMoney() >= 0.2) {
                // 第二种情况:套餐通话时长已用完,账户余额可以支付1分钟通话,使用账户余额支付
                card.setRealTalkTime(card.getRealTalkTime() + 1); // 实际使用通话时长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 = 0; i < flow; i++) {
            if (this.flow - card.getRealFlow() >= 1) {
                // 第一种情况:流量剩余够 1 MB
                card.setRealFlow(card.getRealFlow() + 1);
            } else if (card.getMoney() >= 0.1) {
                // 第二种情况:套餐内流量已经用完,剩下话费够支付 1 MB的流量
                card.setRealFlow(card.getRealFlow() + 1); // 实际短信数加 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 = 0; i < count; i++) {
            if (this.smsCount - card.getRealSMSCount() >= 1) {
                // 第一种情况:套餐剩余短信数能够发送一个短信
                card.setRealSMSCount(card.getRealSMSCount() + 1);
            } else if (card.getMoney() >= 0.1) {
                // 第二种情况:套餐内短信已经用完,剩下话费能够允许发一条短信
                card.setRealSMSCount(card.getRealSMSCount() + 1); // 实际短信数加 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 / 1024) + "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 = 0; i < minCount; i++) {
            if (this.talkTime - card.getRealTalkTime() >= 1) {
                // 第一种情况:套餐剩余通话时长可以支持1分钟通话
                card.setRealTalkTime(card.getRealTalkTime() + 1);
            } else if (card.getMoney() >= 0.2) {
                // 第二种情况:套餐通话时长已用完,账户余额可以支付1分钟通话,使用账户余额支付
                card.setRealTalkTime(card.getRealTalkTime() + 1); // 实际使用通话时长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 = 0; i < count; i++) {
            if (this.smsCount - card.getRealSMSCount() >= 1) {
                // 第一种情况:套餐剩余短信数能够发送一个短信
                card.setRealSMSCount(card.getRealSMSCount() + 1);
            } else if (card.getMoney() >= 0.1) {
                // 第二种情况:套餐内短信已经用完,剩下话费能够允许发一条短信
                card.setRealSMSCount(card.getRealSMSCount() + 1); // 实际短信数加 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, "把领导骂了一顿非常过瘾,通话90分钟");
    protected static Scene scene1 = new Scene("通话", 30, "打电话给金沂,通话30分钟");
    protected static Scene scene2 = new Scene("短信", 5, "没事闲的发短信玩,发送短信5条");
    protected static Scene scene3 = new Scene("短信", 50, "通知朋友手机换号,发送短信50条");
    protected static Scene scene4 = new Scene("上网", 1024, "晚上偷看小视频,使用流量1GB");
    protected static Scene scene5 = new Scene("上网", 2 * 1024, "晚上偷看小视频,不留神睡着啦!使用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 < 50) {
                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(0, scene0);
        scenes.put(1, scene1);
        scenes.put(2, scene2);
        scenes.put(3, scene3);
        scenes.put(4, scene4);
        scenes.put(5, scene5);

        MobileCard card = cards.get(number); // 获取此卡对象
        ServicePackage pack = card.getSerPackage(); // 获取此卡所属套餐
        Random random = new Random();
        int ranNum = 0;
        int temp = 0; // 记录各场景中的实际消费数据
        do {
            ranNum = random.nextInt(6);
            Scene scene = scenes.get(ranNum); // 获取该序号所有对应的场景
            switch (ranNum) {
            case 0:
            case 1:
                // 序号为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 2:
            case 3:
                // 序号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 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);
    }

    // 资费说明
    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() : 0;
            meg.append("通话时长:" + remainTalkTime + "分钟\n");
            remainSmsCount = cardPack.getSmsCount() > mobileCard.getRealSMSCount()
                    ? cardPack.getSmsCount() - mobileCard.getRealSMSCount() : 0;
            meg.append("短信条数:" + remainSmsCount + "");
        } else if (pack instanceof NetPackage) {
            // 向下转型为网虫对象
            NetPackage cardPack = (NetPackage) pack;
            // 网虫套餐查询上网流量
            remainFlow = cardPack.getFlow() > mobileCard.getRealFlow() ? cardPack.getFlow() - mobileCard.getRealFlow()
                    : 0;
            meg.append("上网流量:" + dataFormat(remainFlow * 1.0 / 1024) + "GB");
        } else if (pack instanceof SuperPackage) {
            // 向下转型为超人对象
            SuperPackage cardPack = (SuperPackage) pack;
            // 超人套餐查询通话时长、上网流量、短信条数。
            remainTalkTime = cardPack.getTalkTime() > mobileCard.getRealTalkTime()
                    ? cardPack.getTalkTime() - mobileCard.getRealTalkTime() : 0;
            meg.append("通话时长:" + remainTalkTime + "分钟\n");
            remainFlow = cardPack.getFlow() > mobileCard.getRealFlow() ? cardPack.getFlow() - mobileCard.getRealFlow()
                    : 0;
            meg.append("上网流量:" + dataFormat(remainFlow * 1.0 / 1024) + "GB");
            remainSmsCount = cardPack.getSmsCount() > mobileCard.getRealSMSCount()
                    ? cardPack.getSmsCount() - mobileCard.getRealSMSCount() : 0;
            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 = 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 {
            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 1: // 选择变更的套餐为话唠套餐
            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(0);
                    cards.get(number).setRealTalkTime(0);
                    cards.get(number).setRealFlow(0);
                    cards.get(number).setSerPackage(Common.talkPackage);
                    System.out.println("套餐更换成功!");
                    Common.talkPackage.showInfo();

                }
            }

            break;

        case 2: // 选择变更的套餐为网虫套餐
            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(0);
                    cards.get(number).setRealTalkTime(0);
                    cards.get(number).setRealFlow(0);
                    cards.get(number).setSerPackage(Common.netPackage);
                    System.out.println("套餐更换成功!");
                    Common.netPackage.showInfo();

                }
            }

            break;

        case 3:// 选择变更的套餐为超人套餐
            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(0);
                    cards.get(number).setRealTalkTime(0);
                    cards.get(number).setRealFlow(0);
                    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() != 0) {
            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() != 0) {
            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 = 0;
        do {
            isExist = false;// 标志位重置为false,用于控制外重循环
            // 生成的随机数是8位,不能小于10000000,否则重新生成
            // 回头重写这段代码,执行效率太低
            do {
                temp = random.nextInt(100000000);
            } while (temp < 10000000);
            // 生成之前,前面加“139”
            number = "139" + 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 = 0; 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 = 78;//价格

    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 = 0; i < minCount; i++) {
            if (this.talkTime - card.getRealTalkTime() >= 1) {
                // 第一种情况:套餐剩余通话时长可以支持1分钟通话
                card.setRealTalkTime(card.getRealTalkTime() + 1);
            } else if (card.getMoney() >= 0.2) {
                // 第二种情况:套餐通话时长已用完,账户余额可以支付1分钟通话,使用账户余额支付
                card.setRealTalkTime(card.getRealTalkTime() + 1); // 实际使用通话时长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 = 0; i < flow; i++) {
            if (this.flow - card.getRealFlow() >= 1) {
                // 第一种情况:流量剩余够 1 MB
                card.setRealFlow(card.getRealFlow() + 1);
            } else if (card.getMoney() >= 0.1) {
                // 第二种情况:套餐内流量已经用完,剩下话费够支付 1 MB的流量
                card.setRealFlow(card.getRealFlow() + 1); // 实际短信数加 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 = 0; i < count; i++) {
            if (this.smsCount - card.getRealSMSCount() >= 1) {
                // 第一种情况:套餐剩余短信数能够发送一个短信
                card.setRealSMSCount(card.getRealSMSCount() + 1);
            } else if (card.getMoney() >= 0.1) {
                // 第二种情况:套餐内短信已经用完,剩下话费能够允许发一条短信
                card.setRealSMSCount(card.getRealSMSCount() + 1); // 实际短信数加 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 / 1024) + "GB/月," + "资费为:" + super.getPrice() + "元/月");
    }
}