银行业务调度系统——设计实现篇

本文探讨了如何通过继承方式优化ServiceWindow类,使其在不同类型的窗口服务中重用代码,以提高效率和减少冗余。通过具体代码示例展示了方法重用和逻辑分离的实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

技术要点:

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()方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值