黑马程序员-银行调度系统1

来源:互联网 发布:淘宝拍卖海关真的吗 编辑:程序博客网 时间:2024/05/20 00:14

---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------

  今天开始新学期的第一次学习,要努力学习,不要计较时间,多花时间,多总结!

     

今天上午从9:42开始学习:

1.我们现在来学习银行调度系统的制作开发:

现在安卓开发非常的火啊,在这里老师主要是讲了一下面试技巧,有时候这个比技术还要重要!

2.那么我们现在讲讲银行业务调度系统的需求:

*银行内有6个业务窗口:1-4是普通窗口,5是快速窗口,6VIP窗口。

*也就对应了三种类型的客户:普通客户,VIP客户,快速客户(快速客户就是专门交水电费,电话费的)

*要异步随机生成各种类型的客户,各类客户的比例为1:6:3

*客户办理的时间有最大值和最小值,在该范围内随机设置每个VIP客户和普通客户办理业务的时间。而快速客户就是最小值。

*在它们对应的窗口依次办理业务。

*VIP窗口和快速窗口没有客户来的时候,可以办理普通业务,但是一旦有客户来,就要优先办理VIP或者快速业务!

*不需要你完成GUI页面设计,只要通过log方式展现程序的运行结果!

3.上面是需求我们了解了一下,那么现在我们来看面向对象的分析和设计:

首先我们知道每个客户就是由银行的取号机器产生号码来表示的。不是说有的人进来银行打扫卫生,有的进来看看,这算不算是业务,当然不算。我们就要设计一个取号机器的类,来产生客户。

其次,我们有三类客户,那么就要有三类号码管理器,它们之间是相互独立的,比如普通号码管理器产生了1号客户,那么VIP窗口是不是产生2号客户,不是,来了一个,还是产生它的1号客户,但是我们去银行看一看,有没有三个号码机器,没有,这三个号码管理器有一个统一的机器管理,它只有一个,所以我们要将这个号码机器设置成单例

接着各类客户在其对应的窗口按顺序依次办理业务,应该是窗口叫号,不是客户自己拿着号去的,是窗口叫去的。那么各个窗口怎么知道该叫哪一个号呢,它肯定是要问它相应的号码管理器,即服务窗口向号码管理器去获取当前要被服务的客户。

4.我们现在大致知道了这个银行系统的面向对象的设计,那么我们来画个类图,再来加深一下:

我们设计了一个号码机器,它管理三个NumberManager,这个NumberManager有两个方法,一个是产生客户,一个是给窗口取号。还要设计一个服务窗口类,里面有三类窗口。

我们在黑板上画圆,那么这个面向对象是谁,是人?是黑板?都不是,是圆,这个圆是由圆心和半径来产生的。还有人推门,门关上了,那么面向对象是哪一个,是人吗,当然不是,是门,人只是推了一下,而门要旋转。类车司机刹车了,这个面向对象是列车。

5.客户需求和面向对象分析都已经做好了,现在我们药开始编写代码了:

我们先new一个java工程,叫做Bank

接着我们再newcom.isoftstone.iterview.bank

然后我们开始新建类,先新建一个NumberManager.java类。

package com.isoftstone.iterview.bank;

public class NumberManager {

//首先它有一个方法,就是产生客户号码

public int generateNewManager(){

//那么它返回的值是什么呢?是上一次取的号码

}

}

6.package com.isoftstone.iterview.bank;

import java.util.ArrayList;

import java.util.List;

public class NumberManager {

//所以定义一个对象,让它的初始值为1

private int lastNumber=1;

private List<Integer> queueNumber=new ArrayList<Integer>();//所以要定义一个排队的数组

//首先它有一个方法,就是产生客户号码

public int generateNewManager(){

//这里要将产生的号码保存在数组中

queueNumber.add(lastNumber);

return lastNumber;

}

//接着它还有一个方法,就是让窗口叫号,让窗口取号

public int fecthServiceNumber()

{

//那么它返回的是什么呢?它是在排队的号码里面取,就是刚刚产生第150个号码,刚刚服务了第50号,那么接着是不是去服务这个刚刚

//产生的号码,当然不是,去服务排队的下一个,51号。

return queueNumber.remove(0);

}

}

7.由于是在两个线程中,而且它们又使用了相同的变量,所以很容易出问题,所以我们要加上同步:

public synchronized int generateNewManager(){

    //这里要将产生的号码保存在数组中

queueNumber.add(lastNumber);

return lastNumber;

}

//接着它还有一个方法,就是让窗口叫号,让窗口取号

public synchronized int fecthServiceNumber()

{

//那么它返回的是什么呢?它是在排队的号码里面取,就是刚刚产生第150个号码,刚刚服务了第50号,那么接着是不是去服务这个刚刚

//产生的号码,当然不是,去服务排队的下一个,51号。

return queueNumber.remove(0);

}

那么这个类就设计完了,难吗?号码产生器!

8.再来编写一个类,管理三个号码管理器的机器。也就是号码机器,它只能有一个,我们要将其设计成单例!

package com.isoftstone.iterview.bank;

public class NumberMachine {

//这里有三个号码管理器对象

private NumberManager commonManager=new NumberManager();//普通客户号码管理器

private NumberManager expressManager=new NumberManager();//快速客户号码管理器

private NumberManager vipManager=new NumberManager();//vip客户号码管理器

public NumberManager getCommonManager() {

return commonManager;

}

public NumberManager getExpressManager() {

return expressManager;

}

public NumberManager getVipManager() {

return vipManager;

}

//然后返回它们的get方法

}

接着我们要将这个号码机器类设置为单例

package com.isoftstone.iterview.bank;

public class NumberMachine {

//这里有三个号码管理器对象

private NumberManager commonManager=new NumberManager();//普通客户号码管理器

private NumberManager expressManager=new NumberManager();//快速客户号码管理器

private NumberManager vipManager=new NumberManager();//vip客户号码管理器

//然后返回它们的get方法

public NumberManager getCommonManager() {

return commonManager;

}

public NumberManager getExpressManager() {

return expressManager;

}

public NumberManager getVipManager() {

return vipManager;

}

//我们来将其设置为单例,首先是构造方法私有化,这样别人就不能来构造它了

private NumberMachine(){}

public static NumberMachine getInstance(){

return instance;

}

private static NumberMachine instance=new NumberMachine();

}





---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------

原创粉丝点击