再次强调一下面向对象设计把握的重要经验:
谁拥有数据,谁就对外提供操作这些数据的方法。
面向对象的分析与设计
1. 有三种对应类型的客户:VIP客户,普通客户,快速客户,异步随机生成各种类型的各户,各类型客户在其对应窗口按顺序依次办理业务。即窗口叫号。VIP客户可在任意空闲窗口办理业务,快速窗口办理完其交费业务后,也可以办理普通客户的业务。
2. 类:
a) NumberManager类
i. 用于管理所有客户号码。能够生成并存储号码。由于窗口也要叫号,所以管理号码的方法要进行同步。
b) NumberMachine类
i. 管理不同类型的号码(vip, 普通, 快速),所以创建三个NumberManager对象,并由三个方法返回它们的实例。一个银行一般只有一个NumberMachine,所以将NumberMachine类设计成单例。
c) CustomerType枚举类
i. 定义三种类型的客户。
d) ServiceWindow类
i. 控制服务窗口的类。启动一个线程,根据三种类型的客户,调用三个方法,并用打印信息的方式,查看运行效果。
e) MainClass类
i. 程序入口。创建4个普通窗口,1个vip窗口和1个快速窗口。
ii. 用定时器,按照比例定时创建随机客户,即号码。分三种:vip、普通和快速。
f) Constants类
i. 用于定义用到的常量
3. Executors类的使用:
a) 使用public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
方法创建延迟的线程池
b) public static ExecutorService newSingleThreadExecutor()
创建一个使用单个 worker 线程的 Executor
4. 整体思路:
a) 银行中有4个普通窗口,一个vip窗口和一个快速窗口。有一台NumberMachine,当开始营业时,一个客户到NumberMachine拿到一个号码,所有窗口则根据号码的类型开始叫号。客户则到叫他号的窗口去办理业务。当客户越来越多时,六个窗口显然不够。就会有许多人等候,如果是普通客户就好办了,人们就等着。但vip客户和快速客户会优先办理业务,其他即将办理业务的普通客户需等待,所以vip窗口和快速窗口有两个供能。