一道面试题--模拟实现简易的移动用户资费统计系统逻辑
概述:
年前在网上看到这道题目,由于自己的工作也是每天纠结于这需求那需求的,就做了下这道题目,并谨慎的发出来,以寻求更多指点。
希望不要飞来板砖一片,本人对此感觉压梨很大。
下面是问题描述与实现代码。
问题描述:
模拟实现简易的移动用户资费统计系统逻辑,具体需求如下:
- 移动运营商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 )