要求:
和實際情況相似,您到銀行辦理業務,到了銀行大廳首先是在電腦上刷卡(有的可能不用刷卡)取出一個紙條,上面有你的位置號還有你前面有多少人,在工作人員那里會有一個按鈕,點擊一下就會叫一個人到他那里辦理業務。這種情況是對于普通用戶來說的,有的銀行還有金卡用戶(就是人家存的錢多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個用戶。這也是此程序的缺點。