要求:
和实际情况相似,您到银行办理业务,到了银行大厅首先是在电脑上刷卡(有的可能不用刷卡)取出一个纸条,上面有你的位置号还有你前面有多少人,在工作人员那里会有一个按钮,点击一下就会叫一个人到他那里办理业务。这种情况是对于普通用户来说的,有的银行还有金卡用户(就是人家存的钱多nb),他们很是霸道,无论前面排队有多少人,他都会排到第一位。
分析:1.排队肯定是先进先出(First in First out),所以我们要想到用和Queue接口有关的类。
2.金卡用户霸道,要想到用LinkedList来实例化Queue,因为LinkedList有addFirst方法。
3.在这里无法实现读取用户的信息,为了区分金卡用户和普通用户在电脑上设置两个按钮,一个相当于普通用户刷看用的,一个相当于金卡用户刷卡用的。
程序代码如下:
//封装等候者类
package com.dr.bankQueueSystem;
public class Waiter {
private int num;
private int frontnum;
private int flag;
public int getFlag() {
return flag;
}
public void setFlag(int flag) {
this.flag = flag;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public int getFrontnum() {
return frontnum;
}
public void setFrontnum(int frontnum) {
this.frontnum = frontnum;
}
}
//封装工作人员类
package com.dr.bankQueueSystem;
public class Counter {
private int num;
private String counterName;
private Waiter w;
public Counter(Waiter w)
{
this.w=w;
}
public String getCounterName() {
return counterName;
}
public void setCounterName(String counterName) {
this.counterName = counterName;
}
public Waiter getW() {
return w;
}
public void setW(Waiter w) {
this.w = w;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public Counter(int num)
{
this.num=num;
}
public void handleBusiness()
{
System.out.println("I am handling the"+this.w.getNum()+"waiter!");
try{
Thread.sleep(100);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
System.out.println("I have handled the"+this.w.getNum()+",next waiter!");
}
}
//封装服务器类
package com.dr.bankQueueSystem;
import java.util.LinkedList;
import java.util.Queue;
public class BankServer {
private LinkedList<Waiter> waiterList=new LinkedList<Waiter>();//新建等候者队列
public LinkedList<Waiter> Init()//初始化20个等候者
{
for(int i=0;i<20;i++)
{
Waiter w=new Waiter();
w.setNum(i+1);
w.setFrontnum(i);
waiterList.offer(w);
}
return waiterList;
}
}
//用户使用系统客户端
package com.dr.bankQueueSystem;
import java.util.LinkedList;
import java.util.Queue;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
public class WaiterQueueUI {
public static void main(String args[])
{
Display display=new Display();
Shell shell=new Shell(display);
shell.setMaximized(true);
//初始化界面
shell.setText("银行排队用户使用系统");
//服务器初始化
BankServer bs=new BankServer();
final LinkedList<Waiter> waiterList=bs.Init();
//添加普通用户文本框控件
final Text text=new Text(shell,SWT.MULTI);
text.setBounds(40,50,400,500);
//添加普通用户按钮控件
Button button=new Button(shell,SWT.Activate);
button.setBounds(120,600,120,60);
button.setText("普通用户");
//为普通用户按钮添加事件处理
button.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e)
{
Waiter w=new Waiter();
w.setNum(waiterList.size()+1);
w.setFrontnum(waiterList.size());
waiterList.offer(w);
if(waiterList.size()<=50)
{
text.setText("您现在排在"+w.getNum()+"号位置上\n"+"您前面有"+w.getFrontnum()+"人\n"+"请耐心等待");
}
else
{
text.setText("您前面已有50人,请考虑\n您排在"+w.getNum()+"号位置上");
}
}
});
//添加金卡用户文本框控件
final Text goldText=new Text(shell,SWT.MULTI);
goldText.setBounds(700,50,400,500);
//添加金卡用户按钮控件
Button goldButton=new Button(shell,SWT.Activate);
goldButton.setBounds(800,600,120,60);
goldButton.setText("金卡用户");
//为金卡用户按钮控件添加事件处理
goldButton.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e)
{
Waiter w=new Waiter();
w.setFlag(1);
waiterList.addFirst(w);
goldText.setText("尊敬金卡用户,欢迎您的到来");
}
});
shell.layout();
shell.open();
while(!shell.isDisposed())
{
if(!display.readAndDispatch()){
display.sleep();
}
}
}
}
**********************************************************************************
用户界面如下:
//银行工作人员使用系统客户端
package com.dr.bankQueueSystem;
import java.util.LinkedList;
import java.util.Queue;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
public class CounterQueueUI {
public static void main(String args[])
{
Display display=new Display();
Shell shell=new Shell(display);
shell.setMaximized(true);
//初始化界面
shell.setText("银行排队工作人员使用系统");
//服务器初始化
BankServer bs=new BankServer();
final LinkedList<Waiter> waiterList=bs.Init();
//添加文本框控件
final Text text=new Text(shell,SWT.MULTI);
text.setBounds(400,50,400,500);
text.setFont(new Font(display,"宋体",15,SWT.BOLD));
//添加按钮控件
Button button=new Button(shell,SWT.Activate);
button.setBounds(550,600,120,60);
button.setText("下一个");
//为按钮控件添加事件处理
button.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e)
{
Waiter w=waiterList.poll();
if( w!=null)
{
text.setText(w.getNum()+"号顾客请到1号窗口办理业务!");
}
else
{
text.setText("现在没有人办理业务,你可以休息了");
}
}
});
shell.layout();
shell.open();
while(!shell.isDisposed())
{
if(!display.readAndDispatch()){
display.sleep();
}
}
}
}
*************************************************************************
程序运行结果如下
此程序没有用到多线程,无法实现客户与工作人员的连接,所以在服务器初始化时新建了20个用户。这也是此程序的缺点。