---------------------- <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是快速窗口,6是VIP窗口。
*也就对应了三种类型的客户:普通客户,VIP客户,快速客户(快速客户就是专门交水电费,电话费的)
*要异步随机生成各种类型的客户,各类客户的比例为1:6:3
*客户办理的时间有最大值和最小值,在该范围内随机设置每个VIP客户和普通客户办理业务的时间。而快速客户就是最小值。
*在它们对应的窗口依次办理业务。
*当VIP窗口和快速窗口没有客户来的时候,可以办理普通业务,但是一旦有客户来,就要优先办理VIP或者快速业务!
*不需要你完成GUI页面设计,只要通过log方式展现程序的运行结果!
3.上面是需求我们了解了一下,那么现在我们来看面向对象的分析和设计:
首先我们知道每个客户就是由银行的取号机器产生号码来表示的。不是说有的人进来银行打扫卫生,有的进来看看,这算不算是业务,当然不算。我们就要设计一个取号机器的类,来产生客户。
其次,我们有三类客户,那么就要有三类号码管理器,它们之间是相互独立的,比如普通号码管理器产生了1号客户,那么VIP窗口是不是产生2号客户,不是,来了一个,还是产生它的1号客户,但是我们去银行看一看,有没有三个号码机器,没有,这三个号码管理器有一个统一的机器管理,它只有一个,所以我们要将这个号码机器设置成单例!
接着各类客户在其对应的窗口按顺序依次办理业务,应该是窗口叫号,不是客户自己拿着号去的,是窗口叫去的。那么各个窗口怎么知道该叫哪一个号呢,它肯定是要问它相应的号码管理器,即服务窗口向号码管理器去获取当前要被服务的客户。
4.我们现在大致知道了这个银行系统的面向对象的设计,那么我们来画个类图,再来加深一下:
我们设计了一个号码机器,它管理三个NumberManager,这个NumberManager有两个方法,一个是产生客户,一个是给窗口取号。还要设计一个服务窗口类,里面有三类窗口。
我们在黑板上画圆,那么这个面向对象是谁,是人?是黑板?都不是,是圆,这个圆是由圆心和半径来产生的。还有人推门,门关上了,那么面向对象是哪一个,是人吗,当然不是,是门,人只是推了一下,而门要旋转。类车司机刹车了,这个面向对象是列车。
5.客户需求和面向对象分析都已经做好了,现在我们药开始编写代码了:
我们先new一个java工程,叫做Bank。
接着我们再new包com.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>、期待与您交流! ----------------------