银行业务调度系统
一、学习心得:
第一点,和交通灯系统一样,银行业务调度系统也必须用面相对象的思想来设计,不然会很繁琐。所以,必须在平时的学习中重视面向对象设计的练习和掌握。
第二点,要设计这个银行业务系统,就要将这个银行的业务搞明白,细节之处不能忽视,比如这几个问题的解决,这么多业务窗口,怎么知道谁是客户,该叫哪一个号呢?明明是有三种不同类型的客户,普通客户、快速客户、VIP客户,肯定是按三种不同类型排号的,但银行明明没有过那么多的排号机器啊,号码机器是不是应该只有一个啊?不细心观察银行的业务,是不会注意到这些的,就像之前的交通灯系统设计中一样,如果不是老师提醒,我还真没注意:红灯之后立刻就是绿灯,而不经过黄灯这个过程的。所以分析问题得仔细,平时就该养成对待事物多观察多思考的习惯。
第三点,要简化无关项,集中问题落脚点。至于什么的客户才算普通客户,什么样的客户算快速客户?我们没必要深究,只要知道客户在号码管理机器上选择了相应的操作信息 后,我们就知道他是什么样的客户了。
二、银行业务调度系统分析及设计过程:
这个系统最终要达到的工作过程是这样的:客户来了之后,通过号码机器选择号码,与此同时,业务窗口要循环向号码机器要号码,当客户选择一个号码后,业务窗口就可以从号码机器中读取到一个号码,然后通知这个客户到窗口办理业务。业务窗口收到一个号码并成功接收一个客户到他的窗口办理业务时,就停止向号码机器要号码。再来客户时,号码机器就把号码分配给别的业务窗口。在程序的相应地方,要根据业务的不同,打印显示一下业务和客户信息,以便验证程序的正确性。
从这个过程中,不难分析出,有三个模块需要设计。产生号码的模块、分配管理号码的模块和业务窗口的模块,在理解和分析过程中,可以用画图的方式来分析,这样清楚明白,方便理解:
在实际写代码过程中,以下几点要注意掌握和理解:
1、 自己要熟练掌握好单例的设计:
自行提供这一个实例并向整个系统提供这个实例
模式一:饿汉式单例:
private numberMachine(){}
public static NuberMachine getInstance(){
return instance;
}
private static NumberMachine instance = new NumberMachine();
模式二:懒汉式单例
public class numberMachine() {
private static NumberMachine instance = null;
public static synchronized NumberMachine getInstance() {
if (instance==null)
instance=new NumberMachine ();
return instance;
}
}
2、Executors类启动管理线程:
1 public static ExecutorService newCachedThreadPool()
创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将它们重用。
2 public static ExecutorService newFixedThreadPool(int nThreads)
创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。
3 public static ExecutorService newSingleThreadExecutor()
创建一个使用单个线程的 Executor,以无界队列方式来运行该线程。
这三个方法都可以配合接口ThreadFactory的实例一起使用。并且返回一个ExecutorService接口的实例。
4接口 ThreadFactory
根据需要创建新线程的对象。使用线程工厂就无需再手工编写对 new Thread 的调用了,从而允许应用程序使用特殊的线程子类、属性等等。
此接口最简单的实现就是:
class SimpleThreadFactory implements ThreadFactory {
public Thread newThread(Runnable r) { return new Thread(r); }
}
5. 接口ExecutorService该接口提供了管理终止的方法。
3、if else和Switch语句效率比较:
如果要深入验证比较两者的效率,个人现阶段掌握的知识不够,通过网友的邮箱例子比较分析,得到以下结论(来着互联网):
(1)switch的效率一般比if-else高 ;switch 效率高, 从汇编代码可以看出来switch 只计算一次值,然后都是test , jmp, if...else 是每个条件都要计算一遍的;
(2) switch的效率与分支数无关 ;
(3) 当只有分支比较少的时候,if效率比switch高(因为switch有跳转表),分支比较多,switch效率要高。
4、使用List比使用ArraList好处多:
private List<Integer> queueNumber = new ArrayList <Integer>();
一般情况下,如果没有必要,推荐代码只同List,Map接口打交道。
这样做的原因是list就相当于是一个泛型的实现,如果想改变list的类型,只需要: List list = new LinkedList();//LinkedList也是List的实现类,也是ArrayList的兄弟类。
这样,就不需要修改其它代码,这就是接口编程的优雅之处.
另外,如果在类的方法中声明:private void queueNumber (List list){}
这个方法就能能处理所有实现了List接口的类,一定程度上实现了泛型函数.