移动计费系统_张孝祥
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
getNumber方法:
private static int getNumber(String key){ String value = config.getProperty(key); try{ return Integer.parseInt(value); }catch(Exception e){ return 0; } }
ቤተ መጻሕፍቲ ባይዱ
ComputeStrategy类:computeMoney方法 ConfigManager类: getUnitPrice、getPackFree、getPackCharge、getNewUserFree等方法
另外,应该有一个总的策略对象来管理各个功能项目的策略对象以及VIP用户的月租费或月基本费, 所谓订购套餐,就是选用哪个策略对象,所以,订购某个功能套餐和退订某个功能套餐的方法应 分配给这个总的策略对象。这个总的策略对象内部既要存储各个功能项的当前的套餐对应的策略 对象、又要存储下月订购的套餐,还要在下个月时将订购的套餐“设置”为当前的套餐,这个 “设置”不一定是真的变量赋值操作,可以是通过日期比较的方式来达到,这需要设计一个辅助 类把某月和从该月开始订购的功能套餐进行关联存储。据此,可以分析出如下一些类和方法:
PackStrategy类:orderRent、cancelRent、getValidRent、orderPack、cancelPack、getValidComputeStrategy
OrderedStrategyHolder类:order、getValidStrategy
程序员网校 www.it315.org
MobileCorporation类:simulationBusiness方法(模拟一个月的业务,内部随机做500件事情和结算每个用户的计费情 况,随机做的事情就是挑选一个用户做其中任何一件事情:打电话/发短信/数据通信/定套餐/退订套餐/新用户入网) Customer、CommonCustomer、VipCustomer等类:打电话/发短信/数据通信/定套餐/退订套餐/结算费用等方法。普 通用户和VIP用户的区别在于定套餐、退订套餐、结算费用的策略对象不同。
程序员网校 www.it315.org
程序员网校
www.it315.org
—致力于让技术学习变得轻松和简单!
计算某个功能项费用的对象
public class ComputeStrategy { //此处省略成员变量的定义…. public ComputeStrategy(int customerType, int packType,int entryType) { this.customerType = customerType; this.packType = packType; this.entryType = entryType; switch(entryType){ case 0:entryName = "电话";break; case 1:entryName = "短信";break; case 2:entryName = "数据";break; } } public int computeMoney(int quantity){ int unitPrice = ConfigManager.getUnitPrice(customerType, packType,entryType); int freeQuantity = ConfigManager.getPackFree(customerType, packType,entryType); int packCharge = ConfigManager.getPackCharge(customerType, packType,entryType); int charQuantity = quantity - freeQuantity; if(chargeQuantity < 0){ chargeQuantity = 0; } int money = packCharge + price * chargeQuantity; System.out.println(" " + entryName + "月功能费为:" + packCharge + "分钱,"); System.out.println(" 收费数量:" + quantity + "-" + freeQuantity + "=" + chargeQuantity + ","); System.out.println(" 使用收费:" + chargeQuantity + "*" + price + "=" + price * chargeQuantity +"分钱,"); System.out.println(" 小计收费:" + packCharge + "+" + price * chargeQuantity + "分钱"); return money; } }
makePrefix方法:
private static String getPrefix(int customerType,int packType,int entryType){ String packTitles = {"normal","pack1","pack2“,”new”}; String entryTitles ={"phone","message","data"}; String customerTitle = customerType==0?"common":"vip"; String packTitle = packTitles[packType]; String entryTitle = entryTitles[entryType]; return customerTitle + "." + packTitle + "." + entryTitle; }
程序员网校 www.it315.org
程序员网校
www.it315.org
—致力于让技术学习变得轻松和简单!
移动计费系统的项目需求(1)
程序员网校 www.it315.org
程序员网校
www.it315.org
—致力于让技术学习变得轻松和简单!
移动计费系统的项目需求(2)
程序员网校 www.it315.org
程序员网校
www.it315.org
—致力于让技术学习变得轻松和简单!
移动计费系统的项目需求(3)
程序员网校 www.it315.org
程序员网校
www.it315.org
—致力于让技术学习变得轻松和简单!
移动计费系统的项目需求(4)
程序员网校 www.it315.org
程序员网校
www.it315.org
凭借积累的面向对象设计的经验,可以把计算电话、短信、数据费用的功能各封装成一个策略对 象,这些策略对象内部根据当前的用户类别、当月适用的套餐和计费的功能项目来计算费用。策 略对象在计算费用时,要从Properties文件中读取相应的数据值,为此可以专门设计一个类来读 取配置文件,策略对象调用该类的方法。据此,可以分析出如下一些类和方法:
程序员网校 www.it315.org
程序员网校
www.it315.org
—致力于让技术学习变得轻松和简单!
背景介绍
软件开发公司现在都越来越精明和狡猾了,他们把日后工作中要解决的问题、并且是他 们自己都很难解决的问题拿出来让面试求职者去搞, 不管面试求职者的水平怎样,他 们都说谁能搞定,谁就来上班,这样至少求职者在进公司之前就已经为公司做了贡献。 软件公司这招够狠、够高! 在前一阵有两名同学出去面试,招聘单位分别给他们两个小项目拿回家做,三天内做出 来即可给到7k以上的月薪,我都帮他们做了,他们也顺利上班了,详情参看《交通灯管 理系统》和《银行业务调度系统》的介绍。不久,又有一名学员给我打电话,让我帮他 做一道类似的题目,不过,这次项目变成了“移动用户资费统计系统”,再细问,知道 这次的招聘公司不是软通动力了,而是联想利泰,这两家公司提供的word文档格式都 完全一样,我奇怪现在的软件公司怎么都学会用这招来考核求职者。 《移动用户资费统计系统》的业务比《交通灯管理系统》和《银行业务调度系统》的业 务都要复杂得多,我拿到需求文档后,一时间也不知如何着手。按照“移动用户资费统 计系统”的需求文档认认真真地做了两天,体力透支很大,加之十几年的编程生涯,我 一直处于亚健康状态,这个“移动用户资费统计系统”终究成了 压倒骆驼的最后一根 稻草,我累得病倒了!等到身体康复后,我不甘心事情只做了一半就放弃了,接着又花 了两天的时间,总算把这个项目题给做完了,结果又累病倒了。 后来又有好几名去联想利泰面试的学员拿着这个《移动用户资费统计系统》找我,我每 次都把源代码给了这些学员,并讲解清楚了其中的代码结构,后来问这些学员,他们一 个也没被录取,他们一致认为是被该公司戏弄了,该公司可能只是想找个人来向他们讲 解如何来实现此系统的代码,看来着实枉费了我一番心机和功夫。
程序员网校
www.it315.org
—致力于让技术学习变得轻松和简单!
类图
程序员网校 www.it315.org
程序员网校
www.it315.org
—致力于让技术学习变得轻松和简单!
编码读取配置文件中的各项数据
ConfigManager类中的方法:
公有:getUnitPrice、getPackFree、getPackCharge、getNewUserFree。 私有:makePrefix、getNumber
程序员网校 www.it315.org
程序员网校
www.it315.org
—致力于让技术学习变得轻松和简单!
在配置文件中存储各项数据
采用一种便于程序代码读取的格式:
要存储的数据项有:功能单价费用、功能套餐免费数量、功能套餐月费用、新入网免费数量、整 体月基本费或月租费。 一些数据还要随以下类型进行区分:用户类型、套餐类型、功能类型。 在配置文件中通过用点(.)对数据项名称进行分级的方式来区分各个数据项所属的类别和功能, 如下所示: common.normal.phone.price 表示普通用户/非套餐/电话/单价 common.pack1.phone.price 表示普通用户/套餐/电话/单价 common.pack1.phone.free 表示普通用户/套餐/电话/免费数量 common.pack1.phone.rent 表示普通用户/套餐/电话/套餐月功能费用 vip.normal.phone.price 表示VIP用户/非套餐/电话/单价 vip.pack1.phone.price 表示VIP用户/套餐1/电话/单价 vip.pack2.phone.price 表示VIP用户/套餐2/电话/单价 common.new.phone.free 表示普通用户/新开户/电话/免费数量 vip.new.phone.free 表示VIP用户/新开户/电话/免费数量 对于值为0的数据项,不用在配置文件中存储,这样,当程序代码从配置文件中没有读取到该数 据项时,即认为该值为0。 对于vip用户的整体月基本费或月租费,由于计费单位不一样,采用配置文件方式存储将增加程序 的复杂度,所以,决定直接在程序代码中硬编码。
程序员网校
www.it315.org
—致力于让技术学习变得轻松和简单!
面试题系列
—移动计费系统
讲师:张孝祥
程序员网校 www.it315.org
程序员网校
www.it315.org
—致力于让技术学习变得轻松和简单!
程序员网校的发展理念
对每个程序员来说,没有学不会的技术,只是没有那么多的时间与精力! 如果能用最少的时间学透自己想要的技术,是程序员感到最幸福的事情! 程序员要学的知识细节实在太多,程序员要把一个知识完全搞明白所走 的弯路太多,一个程序员积累的知识量等到可以从容面对工作时,又发 现自己的体力已经被前些年的学习和摸索掏空和耗尽了!每个程序员都 在经历这样的轮回,程序员网校在想:“能否让程序员的职业生涯更长 些?程序员的工作变得轻松些?” 如果要想让程序员的工作变得简单些,首先就应该让技术学习变得轻松! 如果一个人把自己通过一年精心梳理出来的某个经验一针见血地用一个 小时交给了其他的千万人,其他人岂不节省了很多很多的宝贵时间吗? 如果有很多有经验的人士都来开放、交流、共享自己的经验,程序员的 工作还会那么辛苦吗? 程序员网校必将精心制作每个技术点的文字与视频教程,尽可能一针见 血地讲解清楚问题的本质和最大限度地节省学习者的学习时间,让程序 员把富余的时间投入到工作和生活中去,为提高程序员的生活状况尽最 大努力!
程序员网校 www.it315.org
程序员网校
www.it315.org
—致力于让技术学习变得轻松和简单!
面向对象的分析与设计
移动公司里面有两类客户,移动公司里的客户可以打电话、发短信、数据通信,还可以订购和退 订套餐;移动公司每月要为其中所有客户生成计费清单,还要模拟各种客户的行为。据此,可以 分析出如下一些类和方法:
—致力于让技术学习变得轻松和简单!
数据分析与统一计算公式
统一各类用户在各种情况下的费用计算公式:
整体月基本费或月租费:月基本费方式为固定值,月租费方式为当月 总天数*每天费用或者(当月总天数-入网日+1)*每天费用,只有vip 用户才存在此项费用,但是为了统一计算公式,可以认为普通用户也 有此项费用,值为0。 电话收费时长:等于(电话时长-免费时长),计算后的值小于0则记为0, 免费时长又分为两类:新入网的免费和套餐中的免费,新入网的免费 在用户对象中处理,套餐中的免费封装在套餐策略对象中处理。 电话、短信、数据套餐月功能费:只有普通用户定了套餐才有此项费 用,但是为了统一计算公式,可以认为没定此功能套餐的普通用户和 vip用户也有此项费用,值为0。 月电话费用=电话套餐月功能费+单位计费价格*电话收费时长 按月电话费用的相同规则计算月短信费用和月数据费用 月总计费用=整体月基本费或月租费 + 月电话费用 + 月短信费用 + 月 数据费用