本帖最后由 狂飙的yellow.co 于 2013-6-1 20:46 编辑
Java之实战——银行管理系统(黑马考试) 模拟实现银行业务调度系统逻辑,具体需求如下:
1. 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。
2.有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。
3.异步随机生成各种类型的客户,生成各类型用户的概率比例为: VIP客户 :普通客户 :快速客户 = 1 :6 :3。 4.客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间, 快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。 5.各类型客户在其对应窗口按顺序依次办理业务。 6.当VIP(6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。 7.随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。 8.不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
问题分析: 1. 有三种对应类型的客户:VIP客户,普通客户,快速客户 ,异步随机生成各种类型的客户,各类型客户在其对应窗口按顺序依次办理业务 。
(1)首先,经常在银行办理业务的人更有利于理解本系统
(2)由于有三类客户,每类客户的号码编排都是完全独立的,所以,我想到本系统一共要产生三个号码管理器对象,各自管理一类用户的排队号码。 这三个号码管理器对象统一由一个号码机器进行管理,这个号码机器在整个系统中始终只能有一个,所以,它要被设计成单例。
2. 各类型客户在其对应窗口按顺序依次办理业务 ,准确地说,应该是窗口依次叫号。 (1)各个窗口怎么知道该叫哪一个号了呢?它一定是问的相应的号码管理器,即服务窗口每次找号码管理器获取当前要被服务的号码。
(2)如果我不是多次亲身经历银行的这种业务,再加之积累了大量面向对象的应用开发经验,我也不知道能否轻松进行这种设计,能否发掘出其中隐含的对象信息, 我真说不出具体的经验是什么,就是日积月累出来的一种感觉。难道这就是传说中的:“只可意会,不可言传?”、
综上所述,我们可以得到以下结论
1、需要有一个号码产生器类,该号码产生器只能通过单例模式来产生,该号码提供3个方法,分别可以生成3种不同类型的号码 2、需要有一个号码管理器类,它可以从号码产生器中获取号码,也可以提供下一个需要服务的号码 3、需要有一个服务窗口类,它可以从号码管理器中获取下一个需要服务的号码,并且对3种不同的客户进行服务
面向对象的关键: 你不能首先考虑这个程序需要实现什么,你必须要首先思考这个程序要模拟什么 也就是说,你必须要先通过在实际生活中的思维方式,把整个业务流程模拟出来 然后再对整个业务流程进行抽象
技术要点:
1、当你已经将一个系统的结构设计好之后,就应当从最简单的一小段核心代码写起这段核心代码可以不通用,可以只实现最基本的一个小功能,也可以写的非常不完善但是,当你以后需要这段代码提供更通用的功能时,你就只需要按照你的设计去逐渐扩充这段代码就可以了其实最重要的就是,不要妄想从一开始你就把代码写的非常完美,编写代码的过程,永远就是一个不断完善已有代码的过程
2、如果多个方法的代码中只有部分逻辑不同,大部分都是相同的话,就可以把这些方法统一成一个方法然后,把这个方法中逻辑不同的部分抽取出来,定义成另外一个方法,然后为其创建若干个子类并重写抽取出来的这个方法这样在不同的子类中调用同一个方法时,就可以实现不同的逻辑了
3、当需要使用多线程同时访问一个对象时,需要使用synchronize来控制线程的安全
其中文件对于这种问题一定不要慌张,一定要仔细分析,并利用好网络资源 其中有些是参考了一些老师的讲解和代码 实现的代码 - package com.isoftstone.interview.bank;
- public class Constants {
- public static int MAX_SERVICE_TIME = 10000;
- public static int MIN_SERVICE_TIME = 1000;
- public static int COMMON_CUSTOMER_INTERVAL_TIME = 1;
- }
- //客户的类型
- package com.isoftstone.interview.bank;
- public enum CustomerType {
- COMMON,EXPRESS,VIP;
- public String toString(){
- String name = null;
- switch(this){
- case COMMON:
- name = "普通";
- break;
- case EXPRESS:
- name = "快速";
- break;
- case VIP:
- name = name();
- break;
- }
- return name;
- }
- }
复制代码 ________________________________________________________________华丽的分割线_____________________________________________
数据过大。。。。。。。。。。。。。。。。。。所以做了文本打包了供大家使用
|