技术要点:
1、当你已经将一个系统的结构设计好之后,就应当从最简单的一小段核心代码写起
这段核心代码可以不通用,可以只实现最基本的一个小功能,也可以写的非常不完善
但是,当你以后需要这段代码提供更通用的功能时,你就只需要按照你的设计去逐渐扩充这段代码就可以了
其实最重要的就是,不要妄想从一开始你就把代码写的非常完美,编写代码的过程,永远就是一个不断完善已有代码的过程
2、如果多个方法的代码中只有部分逻辑不同,大部分都是相同的话,就可以把这些方法统一成一个方法
然后,把这个方法中逻辑不同的部分抽取出来,定义成另外一个方法,然后为其创建若干个子类并重写抽取出来的这个方法
这样在不同的子类中调用同一个方法时,就可以实现不同的逻辑了
3、当需要使用多线程同时访问一个对象时,需要使用synchronize来控制线程的安全
程序代码:
NumberManager类(号码生成器类)
package bank;
import java.util.ArrayList;
import java.util.List;
public class NumberManager {
private int number = 0;
private List <Integer> queue = new ArrayList <Integer> ();
public void generateNumber () {
number = number + 1;
queue.add(number);
}
public Integer getNumber () {
if (queue.size() > 0) {
return queue.get(0);
}
return null;
}
}
NumberMachine类(号码管理器类)
package bank;
public class NumberMachine {
private NumberManager commonNumberManager = new NumberManager();
private NumberManager expressNumberManager = new NumberManager();
private NumberManager vipNumberManager = new NumberManager();
/* 单例模式 */
//构造方法私有化
private NumberMachine() {}
//提供唯一的实例化对象
private static NumberMachine machine = new NumberMachine();
//提供获取该类的实例化对象的静态方法
public static NumberMachine getNumberMachine() {
return machine;
}
public NumberManager getCommonNumberManager() {
return commonNumberManager;
}
public NumberManager getExpressNumberManager() {
return expressNumberManager;
}
public NumberManager getVipNumberManager() {
return vipNumberManager;
}
}
ServiceWindow类(服务窗口类)
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ServiceWindow {
private String windowName; //窗口名称
private CustomerType type; //窗口类型
public void setWindowName(String windowName) {
this.windowName = windowName;
}
public void setType(CustomerType type) {
this.type = type;
}
//启动服务
public void startService() {
ExecutorService pool = Executors.newSingleThreadExecutor();
pool.execute(new Runnable () {
public void run() {
switch(type) {
case COMMON:
commonService(type);
break;
case EXPRESS:
expressService();
break;
case VIP:
vipService();
break;
}
}
});
}
public void commonService(CustomerType type) {
NumberManager manager = NumberMachine.getNumberMachine().getCommonNumberManager();
while (true) {
System.out.println("第" + windowName + "号" + type + "窗口开始获取" + type + "用户!");
Integer number = manager.getNumber();
if (number != null) {
System.out.println("第" + windowName + "号" + type + "窗口开始为第" + number + "号" + type + "用户服务");
Random random = new Random();
int minServiceTime = Constant.MIN_SERVICE_TIME;
int maxServiceTime = Constant.MAX_SERVICE_TIME - Constant.MIN_SERVICE_TIME;
int serviceTime = random.nextInt(maxServiceTime) + 1 + minServiceTime;
long startTime = System.currentTimeMillis();
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
int workTime = (int)(endTime - startTime)/1000;
System.out.println("第" + windowName + "号" + type + "窗口为第" + number + "号" + type + "用户服务完毕!总共用时" + workTime + "秒!");
} else {
System.out.println("第" + windowName + "号" + type + "窗口未找到" + type + "用户!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public void expressService() {
NumberManager manager = NumberMachine.getNumberMachine().getExpressNumberManager();
while (true) {
System.out.println("第" + windowName + "号" + type + "窗口开始获取" + type + "用户!");
Integer number = manager.getNumber();
if (number != null) {
System.out.println("第" + windowName + "号" + type + "窗口开始为第" + number + "号" + type + "用户服务");
int serviceTime = Constant.MIN_SERVICE_TIME;
long startTime = System.currentTimeMillis();
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
int workTime = (int)(endTime - startTime)/1000;
System.out.println("第" + windowName + "号" + type + "窗口为第" + number + "号" + type + "用户服务完毕!总共用时" + workTime + "秒!");
} else {
System.out.println("第" + windowName + "号" + type + "窗口未找到" + type + "用户!");
commonService(CustomerType.COMMON);
}
}
}
public void vipService() {
NumberManager manager = NumberMachine.getNumberMachine().getVipNumberManager();
while (true) {
System.out.println("第" + windowName + "号" + type + "窗口开始获取" + type + "用户!");
Integer number = manager.getNumber();
if (number != null) {
System.out.println("第" + windowName + "号" + type + "窗口开始为第" + number + "号" + type + "用户服务");
Random random = new Random();
int minServiceTime = Constant.MIN_SERVICE_TIME;
int maxServiceTime = Constant.MAX_SERVICE_TIME - Constant.MIN_SERVICE_TIME;
int serviceTime = random.nextInt(maxServiceTime) + 1 + minServiceTime;
long startTime = System.currentTimeMillis();
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
int workTime = (int)(endTime - startTime)/1000;
System.out.println("第" + windowName + "号" + type + "窗口为第" + number + "号" + type + "用户服务完毕!总共用时" + workTime + "秒!");
} else {
System.out.println("第" + windowName + "号" + type + "窗口未找到" + type + "用户!");
commonService(CustomerType.COMMON);
}
}
}
}
思考题:(自己想到的,以后有时间做)
尝试继承的方式来尽可能地重用ServiceWindow中的service()方法