黑马程序员学习笔记十——银行业务管理系统

---------------------- android培训java培训、期待与您交流! ----------------------

银行业务调度系统 分析设计

顾客不定时不结对的去银行办理业务,进银行首先要去取号机取号,那么他会根据自己办理业务的类型取号,业务类别分别是 Vip贵宾业务,快速办理业务,普通客户业务。取完号后,银行对应窗口得到任务依次叫号办理,假如有窗口空闲,顾客取的是vip 或者其他等待办理业务的客户取vip号码,vip优先。

从这段话初步得到可以设计对象为:取号机随机生成号码让顾客取号,所以有个号码管理器,业务窗口得到分配的号码任务,服务窗口服务。

结构如图:


开始设计:

首先设计 号码管理机器NumberManager。该类要具备生成新号码generateNewManager()的方法,同时还要有取号的的方法fetchServiceNumber()。并且他们呢同属于一个队列集合。

第二、 设计NumberMachine 用单例实现。 他管理三个返回的业务号码commonManger (普通业务),ExpressManger(快速业务),vipMangervip 业务)。

第三。设计窗口叫号WindowService。既然是不断叫号,那么就是一个线程。建立线程并创建线程池取号(普通,快速,vip

第四 主函数 类 新建线程  模拟三类客户不停取号。

下面是部分代码:

public class NumberMachine {

//他有三个管理器

private NumberManager commonManger=new NumberManager();

private NumberManager ExpressManger=new NumberManager();

private NumberManager vipManger=new NumberManager();

//返回三个方法

public NumberManager getCommonManger() {

return commonManger;

}

public NumberManager getExpressManger() {

return ExpressManger;

}

public NumberManager getVipManger() {

return vipManger;

}

//单例构造方法

private NumberMachine(){

}

//静态调用 需要返回一个对象 ,对象由自己创立

public static NumberMachine getInstance(){

return instance;

}

//自己创建对象

 private static NumberMachine instance=new NumberMachine();

   

}

public class NumberManager {

//定义上一次返回的号码

private int lastNumber=1;

//排队队列

private List<Integer> queueNumber=new ArrayList<Integer>();

//号码生成器  返回上一个号码 ++  为了互斥 采用synchronized

public synchronized Integer generateNewManager(){

//将号码存起来

queueNumber.add(lastNumber);

return lastNumber++;

}

//取号

public synchronized Integer fetchServiceNumber(){

if(queueNumber.size()>0){

return (Integer)queueNumber.remove(0);

}else{

return null;

}

}

}

public class ServiceWindow {

//定义窗口类型

private CustomerType type=CustomerType.COMMON;

//定义窗口号

private int window =1;

//提供set方法

public void setType(CustomerType type) {

this.type = type;

}

public void setWindow(int window) {

this.window = window;

}

//叫号  启动一个线程池

public void start(){

Executors.newSingleThreadExecutor().execute(new Runnable(){

public void run(){

//取号 

while(true){

//NumberMachine 取号

switch (type){

case COMMON:

commonService();

break;

case EXPRESS:

expressService();

break;

case VIP:

vipService();

break;

}

}

}

});

}

private void commonService() {

String windowName=""+window+""+"普通窗口";

Integer number=NumberMachine.getInstance()

.getCommonManger().fetchServiceNumber();

System.out.println(windowName+"正在获取任务");

if(number!=null){

long beginTime=System.currentTimeMillis();

int maxRand=Constants.MAX_SERVISE_TIMER

-Constants.MIN_SERVISE_TIMER;

long serveTime=new Random().nextInt(maxRand)+1

+Constants.MIN_SERVISE_TIMER;

try {

Thread.sleep(serveTime);

} catch (InterruptedException e) {

e.printStackTrace();

}

long costTime=System.currentTimeMillis()-beginTime;

System.out.println(windowName+"为第"

+number+""+"普通客户完成服务,耗时"

+costTime/1000+"");

}else{

System.out.println(windowName+"没有取到服务任务,先休息一下");

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

private void expressService() {

String windowName=""+window+""+type+"窗口";

Integer number=NumberMachine.getInstance()

.getExpressManger().fetchServiceNumber();

System.out.println(windowName+"正在获取任务");

if(number!=null){

long beginTime=System.currentTimeMillis();

try {

Thread.sleep(Constants.MIN_SERVISE_TIMER);

} catch (InterruptedException e) {

e.printStackTrace();

}

long costTime=System.currentTimeMillis()-beginTime;

System.out.println(windowName+"为第"

+number+""+type+"客户完成服务,耗时"

+costTime/1000+"");

}else{

System.out.println(windowName+"没有取到服务任务,先休息一下");

commonService();

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

private void vipService() {

String windowName=""+window+""+type+"窗口";

Integer number=NumberMachine.getInstance()

.getVipManger().fetchServiceNumber();

System.out.println(windowName+"正在获取任务");

if(number!=null){

long beginTime=System.currentTimeMillis();

int maxRand=Constants.MAX_SERVISE_TIMER

-Constants.MIN_SERVISE_TIMER;

long serveTime=new Random().nextInt(maxRand)+1

+Constants.MIN_SERVISE_TIMER;

try {

Thread.sleep(serveTime);

} catch (InterruptedException e) {

e.printStackTrace();

}

long costTime=System.currentTimeMillis()-beginTime;

System.out.println(windowName+"为第"

+number+""+type+"客户完成服务,耗时"

+costTime/1000+"");

}else{

System.out.println(windowName+"没有取到服务任务,先休息一下");

commonService();

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}


----------------------  android培训 java 培训 、期待与您交流!  ----------------------

详细请查看: http://edu.csdn.net/heima


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值