遗忘海岸

江湖程序员 -Feiph(LM战士)

导航

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

概述:

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

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

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

 

问题描述:

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

  • 移动运营商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 )

   点击下载

posted on 2011-01-04 10:47  遗忘海岸  阅读(873)  评论(5编辑  收藏  举报