Java面向对象和高级特性 项目实战(一)

一、项目简介

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

  

二、技能点 

  

三、系统概述

  

四、整体开发思路

  

五、实体类和接口开发

   

  

六、 创建工具类

  

七、使用集合存储数据

  

八、开发计划

  

九、代码实现  

  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();
        }
    }

}

原文地址:https://www.cnblogs.com/yutianbao/p/10713905.html

时间: 2024-11-07 14:44:44

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

深入java虚拟机-jvm高级特性和实战

第一部分 走近java 第一章 java技术体系 官方所定义的java技术体系 java程序设计语言 各硬件平台上的java虚拟机 Class文件格式 java api类库 来自商业机构和开源社区的第三方java类库 我们可以把java程序设计语言.java虚拟机.java api类库这三部分统称为JDK,是用于支持java程序开发的 最小环境把java api类库总的javaSE api子集和java虚拟机统称为JRE,是支持java程序运行的标准环境. 第二部分 自动内存管理机制 第二章 内

Python面向对象编程高级特性

***这里还是根据网上资料,主要是廖雪峰老师的教程学习的笔记,主要介绍python面向对象的高级特性,笔记不全,只是记录自己觉得容易出错的地方*** 1.python作为一种动态语言,他的动态绑定机制允许在运行过程中动态的给class或者对象实例添加方法和属性,这个在静态语言中比如java是很难做到的: 1)动态绑定属性: 2)动态绑定方法 给一个实例绑定的方法对于其他实例和类都是不可见的:(这里也说明给一个实例动态绑定方法必须用MethodType(func, instance)) 但是给类绑

《深入理解Java虚拟机 JVM高级特性...》核心笔记

深入理解Java虚拟机 JVM高级特性与最佳实践(第二版) 核心笔记 JAVA 环境: JAVA虚拟机高级特性: 一:java内存区域与内存异常 一):运行数据区     1:程序计数器(Program Counter Register),也称"PC寄存器" A:用来指示需要执行哪条指令的.(在汇编语言中,CPU在得到指令之后,程序计数器便自动加1或者根据                    转移指针得到下一条指令的地址,如此循环,直至执行完所有的指令.) B:由于在JVM中,多线程

java基础篇(二) ----- java面向对象的三大特性之继承

java面向对象的三大特性之继承: 复用代码是java众多引人注目的功能之一,但是想要成为极具革命性的语言,仅仅是复制代码并对其加以改变是不够的.它必须能够做更多的事.引自<Think in java>    而代码复用也是程序员一直不断追求的.由此来说下代码复用的一种方式 java面向对象的三大特性--继承!! 在面向对象程序设计中,继承机制可以有效地组织类的结构.确定类之间的关系,在已有类的基础上开发新的类.继承机制在程序代码复用.提高软件开发效率.降低软件系统维护成本等方面具有重要作用.

java基础篇(一) ----- java面向对象的三大特性之封装

java面向对象的三大特性之封装:   封装(Encapsulation)是面向对象的一个重要特征,就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节. 通俗的讲所谓封装就是将属性和方法捆绑到一起,封装到一个对象中去, 形成一个不可分割的独立单位,以及尽可能隐藏对象的内部结构,也就是说,如果我们使用了封装技术的话,别人就只能用我们做出来的东西而看不见我们做的这个东西的内部结构了. 如果形容一个人(假设把人看做一个类),我们可以用姓名.年龄,性别等来描述,如果不封

云计算视频教程:Java内容微服务架构项目实战

微服务架构模式(Microservice Architect Pattern)是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.微服务架构的本质,是用一些功能比较明确.业务比较精练的服务去解决更大.更实际的问题. 近两年在服务的疯狂增长与云计算技术的进步,让微服务架构受到重点关注,因此很多同学想知道微服务架构的部署及实际应用. 课程简介 MyShopPlus项目致力于推广并普及微服务架构思想,采用全新服务网格系统打造电商生态级产品.通过学习学

java面向对象的三大特性

1.面向对象的三大特性 继承.封装.多态 什么是继承? ①继承是面向对象程序设计能够提高软件开发效率的重要原因之一. ②继承是具有传递性的,就像现实中孙子不仅长得像爸爸而且还像他爷爷. ③继承来的属性和方法是隐式的,也就是在本类里面是看不见的. ④一个类只能有一个父类,也就是类只能是单继承. ⑤一个接口可以有多个父类,也就是接口可以是多继承. 实际项目开发中,一个类继承于另一个类,那么前者就是后者的子类,反则反之. 什么是封装? 对象数据和操作该对象的指令都是对象自身的一部分,能够实现尽可能对外

java -- 面向对象的三大特性(封装,继承,多态)

一.封装 1.什么是封装? 把抽象的数据和对数据的操作封装在一起,隐藏变量的实现细节.数据被保护在内部,程序的其他部分只有通过被授权的操作(成员方法)才能对数据进行访问. 2.封装的步骤?  1.使用private 修饰需要封装的成员变量. 2.提供一个公开的方法设置或者访问私有的属性.通过(get/set)方法获取 3.封装的好处与作用? 封装的作用:1. 框架  2. 工具类 封装的好处:  1. 提高了数据的安全性   2. 操作简单   3. 隐藏了方法的实现. 二.继承 1.继承的格式

《深入理解Java虚拟机:JVM高级特性与最佳实践》学习笔记 Ⅲ 虚拟机执行子系统

第三部分 虚拟机执行子系统第6章 类文件结构//实现语言无关性的基础仍然是虚拟机和字节码存储格式,使用Java编译器可以把Java代码编译为存储字节码的Class文件,使用JRuby等其他语言的编译器一样可以把程序代码编译成Class文件,虚拟机并不关心Class的来源是什么语言,只要它符合Class文件应有的结构就可以在Java虚拟机中运行.1.Class类文件的结构Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑的排列在Class文件之中,中间没有分隔符.Cl