今天我們來做一個(gè)銀行排隊(duì)系統(tǒng),最后用swt實(shí)現(xiàn)圖形界面功能。
先來分析:我們做銀行排隊(duì)系統(tǒng),需要分為銀行工作人員,辦理業(yè)務(wù)的用戶(包括普通用戶和金卡用戶),除此之外,還需要一個(gè)服務(wù)器用來存儲排隊(duì)的用戶隊(duì)列。
細(xì)細(xì)分析:
銀行工作人員有三個(gè)屬性(id,姓名,需要處理的病人)和一個(gè)方法(辦理業(yè)務(wù));用戶有兩個(gè)屬性(排隊(duì)號碼,排在自己前面的人數(shù)),此外,金卡用戶可以排在普通用戶的前面。
服務(wù)器最不好寫,我們需要兩個(gè)隊(duì)列,滿足用戶的先來先辦理業(yè)務(wù)的需求(一個(gè)隊(duì)列存儲普通用戶隊(duì)列,一個(gè)隊(duì)列存儲金卡用戶隊(duì)列),我們還需要一個(gè)初始化隊(duì)列的方法,把一些普通用戶和金卡用戶初始化進(jìn)去。
再說UI上的處理:
1.在用戶客戶端,用戶只需要關(guān)心我排在第幾號,我前面有幾個(gè)人就可以了,因此在用戶客戶端,我們就在點(diǎn)擊事件監(jiān)聽器中把服務(wù)器中的初始化普通用戶隊(duì)列取過來,隊(duì)列的容量就是當(dāng)前用戶前面的人數(shù),隊(duì)列數(shù)加1就是當(dāng)前用戶的號碼,需要注意的是,當(dāng)金卡用戶來的時(shí)候,他會自動排在前面,所以每天加一個(gè)金卡用戶隊(duì)列里的金卡用戶的時(shí)候,普通用戶的隊(duì)列也要添加該用戶,我們只需要做一個(gè)小處理就能實(shí)現(xiàn)該功能,將金卡用戶繼承普通用戶,即可實(shí)現(xiàn)在普通用戶隊(duì)列里添加金卡用戶。
2.在銀行工作人員客戶端,工作人員只需關(guān)心我還要處理多少用戶即可,因此需要將服務(wù)器上的兩個(gè)隊(duì)列取過來,并且先辦理金卡用戶的業(yè)務(wù),只有當(dāng)金卡用戶為空的時(shí)候才開始辦理普通用戶的業(yè)務(wù),因此需要寫一些if和else的語句來判斷金卡或者普通用戶是否為空的情況。
下面附代碼:
銀行工作人員:
package com.dr.goldcardqueue;


public class BankWorker
{

private int id;
private Waiter waiter;

public BankWorker(Waiter waiter)
{
this.setWaiter(waiter);
}

public int getId()
{
return id;
}

public void setId(int id)
{
this.id = id;
}

public Waiter getWaiter()
{
return waiter;
}

public void setWaiter(Waiter waiter)
{
this.waiter = waiter;
}

public void handlBusiness()
{
System.out.println("我正在處理第"+(this.waiter.getNumber()+1)+"號顧客業(yè)務(wù)");

try
{
Thread.sleep(1000);

}catch(InterruptedException e)
{
e.printStackTrace();
}
System.out.println("我已經(jīng)處理完第"+(this.waiter.getNumber()+1)+"號顧客業(yè)務(wù)");
System.out.println("請下一位顧客到第"+(this.id+1)+"號窗口辦理業(yè)務(wù)");

try
{
Thread.sleep(1000);

}catch(InterruptedException e)
{
e.printStackTrace();
}
}
}

普通用戶:
package com.dr.goldcardqueue;


public class Waiter
{

private int number;
private int frontnumber;

public int getNumber()
{
return number;
}

public void setNumber(int number)
{
this.number = number;
}

public int getFrontnumber()
{
return frontnumber;
}

public void setFrontnumber(int frontnumber)
{
this.frontnumber = frontnumber;
}
}

金卡用戶:
package com.dr.goldcardqueue;


public class GoldWaiter extends Waiter
{

private int number;
private int frontnumber;

public int getNumber()
{
return number;
}

public void setNumber(int number)
{
this.number = number;
}

public int getFrontnumber()
{
return frontnumber;
}

public void setFrontnumber(int frontnumber)
{
this.frontnumber = frontnumber;
}
}

服務(wù)器:
package com.dr.goldcardqueue;

import java.util.LinkedList;
import java.util.Queue;


public class Server
{

public Queue<Waiter> waiterlist = new LinkedList<Waiter>();
public Queue<GoldWaiter> goldwaiterlist = new LinkedList<GoldWaiter>();

public Queue<Waiter> init()
{
Waiter waiter = null;

for(int i=1;i<15;i++)
{
waiter = new Waiter();
waiter.setNumber(i);
waiter.setFrontnumber(i-1);
waiterlist.offer(waiter);
}
return waiterlist;
}

public Queue<GoldWaiter> goldinit()
{
GoldWaiter goldwaiter = null;

for(int i=1;i<5;i++)
{
goldwaiter = new GoldWaiter();
goldwaiter.setNumber(i);
goldwaiter.setFrontnumber(i-1);
goldwaiterlist.offer(goldwaiter);
}
return goldwaiterlist;
}
}

用戶客戶端UI:
package com.dr.goldcardqueue;

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 = Display.getDefault();
final Shell shell = new Shell();
shell.setMaximized(true);
shell.setText("銀行排隊(duì)之等待者客戶端");
final Text text = new Text(shell,SWT.MULTI);
text.setBounds(500, 100, 300, 300);
Server server = new Server();
final Queue<Waiter> waiterlist = server.init();
final Queue<GoldWaiter> goldwaiterlist = server.goldinit();
Button button1 = new Button(shell,SWT.Activate);
button1.setBounds(350, 530, 200, 75);
button1.setText("個(gè)人業(yè)務(wù)辦理");

button1.addSelectionListener(new SelectionAdapter()
{

public void widgetSelected(SelectionEvent e)
{
Waiter w = new Waiter();
w.setNumber(waiterlist.size()+1);
w.setFrontnumber(waiterlist.size());
waiterlist.offer(w);

if(waiterlist.size()<=50)
{
text.setText("您現(xiàn)在排在"+w.getNumber()+"位置上,\n您前面有"+w.getFrontnumber()+"個(gè)人\n請您耐心等候吧!哈哈");
}

else
{
text.setText("您前面已經(jīng)排50個(gè)人,請考慮!\n"+"您現(xiàn)在排在"+w.getNumber()+"位置上,\n您前面有"+w.getFrontnumber()+"個(gè)人\n請您耐心等候吧!哈哈");
}
}
});
Button button2 = new Button(shell,SWT.Activate);
button2.setBounds(750, 530, 200, 75);
button2.setText("金卡個(gè)人業(yè)務(wù)辦理");

button2.addSelectionListener(new SelectionAdapter()
{

public void widgetSelected(SelectionEvent e)
{
GoldWaiter gw = new GoldWaiter();
gw.setNumber(goldwaiterlist.size()+1);
gw.setFrontnumber(goldwaiterlist.size());
goldwaiterlist.offer(gw);
waiterlist.offer(gw);

if(goldwaiterlist.size()<=50)
{
text.setText("您現(xiàn)在排在"+gw.getNumber()+"位置上,\n您前面有"+gw.getFrontnumber()+"個(gè)人\n請您等候!");
}

else
{
text.setText("您前面已經(jīng)排超過50人了,請考慮!\n"+"您現(xiàn)在排在"+gw.getNumber()+"位置上,\n您前面有"+gw.getFrontnumber()+"個(gè)人\n請您耐心等候吧!哈哈");
}
}
});
shell.layout();
shell.open();

while(!shell.isDisposed())
{

if(!display.readAndDispatch())
{
display.sleep();
}
}
}
}

銀行工作人員客戶端UI:
package com.dr.goldcardqueue;

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 BankWorkerUI
{


public static void main(String[] args)
{
Display display = Display.getDefault();
final Shell shell = new Shell();
shell.setMaximized(true);
shell.setText("銀行工作人員客戶端");
final Text text = new Text(shell,SWT.MULTI);
text.setBounds(500, 100, 300, 300);
Server server = new Server();
final Queue<Waiter> waiterlist = server.init();
final Queue<GoldWaiter> goldwaiterlist = server.goldinit();
final Button button = new Button(shell,SWT.Activate);
button.setBounds(550, 530, 200, 75);
button.setText("下一個(gè)用戶");

button.addSelectionListener(new SelectionAdapter()
{

public void widgetSelected(SelectionEvent e)
{

if(waiterlist!=null)
{
GoldWaiter gw = goldwaiterlist.poll();

if(gw!=null)
{
text.setText("請"+gw.getNumber()+"號VIP顧客請到1號窗口辦理業(yè)務(wù)");
}

else
{
Waiter w = waiterlist.poll();

if(w!= null)
{
text.setText("請"+w.getNumber()+"號普通顧客請到1號窗口辦理業(yè)務(wù)");
}

else
{
text.setText("現(xiàn)在沒有人辦理業(yè)務(wù)了,您可以休息會了\n 喝杯咖啡吧,哈哈!");
}
}
}
}
});
shell.layout();
shell.open();

while(!shell.isDisposed())
{

if(!display.readAndDispatch())
{
display.sleep();
}
}
}
}

運(yùn)行結(jié)果就是:
用戶客戶端:
銀行工作人員客戶端: