• 一道面试题模拟实现简易的移动用户资费统计系统逻辑


    概述:

         年前在网上看到这道题目,由于自己的工作也是每天纠结于这需求那需求的,就做了下这道题目,并谨慎的发出来,以寻求更多指点。

         希望不要飞来板砖一片,本人对此感觉压梨很大。

         下面是问题描述与实现代码。

     

    问题描述:

    模拟实现简易的移动用户资费统计系统逻辑,具体需求如下:

    • 移动运营商A设置两种类型的用户:普通用户及VIP用户,现该运营商已有5个VIP用户和15个普通用户,共计20个用户。
    • 普通用户资费标准如下(不考虑漫游和长途):

    【基准资费】

      无月租费用。

    通话费:0.6元/ 分钟(仅拨打收费,接听免费)

    短信费:0.1元/ 条

    数据费:5元/ M

              【优惠套餐】

                话费套餐:月功能费20元,最多可拨打60分钟电话,超出时间按照0.5元/分钟计费。

                短信套餐:月功能费10元,最多可发送200条短信,超出条数按照0.1元/条计费。

                数据套餐:月功能费20元,最多可获50M的流量,超出流量按照3元/M 计费。

    注:用户可以选择多种套餐,各功能(通话、短信、数据)计费时,如已选择对应套餐,则按套餐标准计费;如未选择对应套餐,则按对应的基准资费计费。

    • VIP用户资费标准如下(不考虑漫游和长途):

    【基准资费】

      月租费用:按天收取,2元/ 天

    通话费:0.4元/ 分钟(仅拨打收费,接听免费)

    短信费:0.1元/ 条

    数据费:3元/ M

              【优惠套餐】

              套餐1 :月基本费用100元(无月租费用),提供如下服务:

                       ①最多可拨打750分钟电话,超出部分按照0.3元/ 分钟计费。

                       ②最多可发送200条短信,超出条数按照0.1元/ 条计费。

                       ③最多可获得100M数据流量,超出流量按照1元/ M计费。

                套餐2 :月基本费用200元(无月租费用),提供如下服务:

                       ①最多可拨打2000分钟电话,超出部分按照0.2元/ 分钟计费。

                       ②最多可发送500条短信,超出条数按照0.1元/ 条计费。

                       ③最多可获得300M数据流量,超出流量按照0.5元/ M计费。

    注:用户最多只能选择一种套餐,如未选择任何套餐,则按照基准资费计费。

    • 各类型用户只能选择提供给本类型用户的套餐。
    • 新用户入网。

                ①对于新入网的普通用户,入网当月赠送如下服务:免费拨打60分钟

                    电话,免费发送200条短信,免费获得50M流量。超出赠送的部分

                    按照普通用户基准资费进行计费。

                ②对于新入网的VIP用户,入网当月赠送如下服务:免费拨打200分

                    钟电话,免费发送200条短信,免费获得100M数据流量。超出赠送

                    的部分按照VIP用户基准资费进行计费(注意:需按入网天数计算月

                    租费用)。

    • 每月为用户计算一次账单,用户订制的套餐信息和账单信息采用文件方式进行存储(提示:可使用java中的Properties API进行文件操作)。
    • 用户可自由订制或退订所属用户类型的套餐,并从下月起生效。
    • 异步随机生成客户操作如下:

    ①拨打电话,每次拨打时长为1至10分钟不等(随机决定,以分钟为单位)。

    ②发送短信,每次发送条数为1至10条不等(随机决定)。

    ③上网获取数据,每次获取数据流量可为50K,100K,200K,500K,1M(随机决定)。

    ④订制或退订相应套餐。

    ⑤新用户入网(随机决定用户类型)。

    注:随机生成客户操作时间间隔自定,可设置。

    • 不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。

        

         分析与实现部分:

     

        1.资费统计:

         根据问题描述,可见系统共有6种资费计算方式罗列如下:

           1.普通新入网用户,2.VIP新入网用户,3.普通有套惨用户(1-3个),4.普通无套餐用户,5.Vip有套餐用户(1或2),6.Vip无套餐用户。

         这里可以采用策略模式来实现这6类用户的资费统计。

        2. 用户资费计算方式转换:

        引起上面状态转换的事件有

        2.1.新入网用户过了一个自然月,如:2月18入网,那么3月1号凌晨用户就将取消新入网用户计算方式。

        2.2.用户订制或退订某一套餐。

         由于这些事件发出后需要等下个月生效,并且要每月为用户打印一次报表,我这里实现时安排这些任务在每个月的月初(一般是凌晨)来实现。

         这里采用命令模式,将当前月的订制或退订请求放到列表中,然后任务处理模块在下月初执行这些请求。

       3.模拟部分:

       指定一开始时间,使用DateTime.AddHours (1)每次增加一小时来模拟时间,然后遍历全部用户,模拟发短信、打电话、下数据、订制或退订等操作,

       如果增加一小时后引起月分更换,

      1.则执行上一月用户资费清单打印(保存到文件)

      2.更新上月新入网的用户状态

      3.执行订制,退订命令

      4.更新用户资费计算策略

      代码说明:

     

           

       

        运行时请指定一个开始时间与结束时间,结束时间必须大于开始时间,由于是在每个月的月初统计上个月的资费记录,所以结束时间至少是开始时间下一个月的某一天。

      

       代码下载:

       使用Vs2008(.net3.5 )

       点击下载

  • 相关阅读:
    MapReduce程序遇见java.net.UnknownHostException
    吐槽下《Hadoop权威指南(第二版)》的翻译
    HFileOutputFormat与TotalOrderPartitioner
    关于hive multi group by的疑惑
    Hive解决 java.io.IOException:SerDeException:LazySimpleSerDe
    一个字符编码引发的血案
    CSS颜色代码大全
    C#中ParameterizedThreadStart和ThreadStart区别
    Sql Server REPLACE函数的使用
    QueryString的用法
  • 原文地址:https://www.cnblogs.com/wdfrog/p/1925232.html
Copyright © 2020-2023  润新知