一、现实中银行业务流程:
1、假设银行有3种对应的客户:普通客户、快速用户、VIP用户。
2、当3种用户进入银行后,他们会在同一个取号机上进行取号,但是他们取的编号的类型不同。普通用户取号依次是:普通用户1号编号、普通用户2号编号、普通用户3号编号... …
快速用户取号编号依次是:快速用户1号编号、快速用户2号编号、快速用户3号编号… …
VIP用户取号编号依次是:VIP用户1号编号、VIP用户2号编号、VIP用户2号编号… …
3、银行中有对应的服务窗口,因为有三种不同的用户,所以需要有3中不同的服务窗口,每种服务窗口向对应的用户(或者说用户编号)提供服务,窗口会对用户从取号机取走编号的先后顺序进行服务。当服务窗口没有获取正在等待的用户,窗口出于闲置状态。
4、银行还有这样一种机制:当普通用户过多,有普通用户等待的时候,如果快速窗口或者VIP窗口处于闲置状态时,这些窗口会临时对普通用户进行服务。
由以上业务逻辑的分析,我们就可以用面向对象的思想对银行业务调度系统进行分析与设计了。
二、银行业务调度系统面向对象分析:
1、银行要有一个取号机:NumberMachine,并且只有一个,所以我们把NumberMachine设计为单例,取号机上有3种编号管理机制,分别是:普通用户编号管理器:commonManager、
快速用户编号管理器:expressManager、VIP用户编号管理器:VIPManager。所以这三个对象以成员数据的形式存在于NumberMachine类中,当然还要有获取这些成员的方法。
NumberMachine类代码示例及详细注释:
package com.itheima.test.bank;
//编号机器:因为只有一个编号机器,所以设计成单例。
public class NumberMachine {
//普通用户编号管理器
private NumberManager commonManager = new NumberManager();
//快速用户编号管理器
private NumberManager expressManager = new NumberManager();
//VIP用户编号管理器
private NumberManager VIPManager = new NumberManager();
//机器获取Common用户编号管理器
public NumberManager getCommonManager() {
return commonManager;
}
//机器获取Express用户编号管理器
public NumberManager getExpressManager() {
return expressManager;
}
//机器获取VIP用户编号管理器
public NumberManager getVIPManager() {
return VIPManager;
}
//把构造函数私有化,在类外不能被创建对象
private NumberMachine(){}
//在类内自定义一个对象
private static NumberMachine instance = new NumberMachine();
//对外提供一个public方法,用于获取这个对象:NumberMachine.getInstance()
public static NumberMachine getInstance(){
return instance;
}
}
2、同样需要创建编号管理器的类:NumberManager,因为系统描述的是某一个编号被服务的过程,只需要以字符串的形式打印出来即可,所以就不需要创建客户对象了。因此编号管理器需要有添加编号的功能,同时也要有取走编号的功能。这时我们就想想到了集合,同时也要考虑到编号自增的过程。并且NumberManager添加的编号,正是ServiceWindow要进行服务的编号。
NumberManager类代码示例及详细注释:
package com.itheima.test.bank;
import java.util.ArrayList;
import java.util.List;
//编号管理器:生成编号和提供需要被服务的编号
public class NumberManager {
//定义一个int变量表示:上次的编号。初始化值是1编号
private int lastNumber = 1;
//定义一个编号队列集合,用于存储从1~n的编号
private List<Integer> queueNumber = new ArrayList<Integer>();
//号码管理器:生成新的