随笔-10  评论-11  文章-20  trackbacks-0

         这次练习的小项目是模拟银行的排队系统。别且使用SWT通过UI进行模拟操作

         情景再现:当客户来到银行进行办理业务的时候会因为人多产生拥挤的现象,所以银行业务大厅需要一款能够进行排队并且打印出号码的系统,用来解决拥挤现象。但是如果有VIP用户前来办理业务则可以享受优先办理业务的权限。
       
         业务需求:能够进行排队,给每个人编排上正确的号码,VIP用户优先办理。
       
         设计思路:设计一个排队的UI,里面有两个按钮模拟普通客户和VIP用户的区别,点击不同的按钮辨认客户身份,进行不同的编排。设计一个业务员使用的UI,因为在内存层面还不能实现不同窗口中数据的访问,所以设定两个按钮,一个是模拟业务员招待下一个用户,另一个模拟在处理普通业务时有VIP的到来。客户队列使用容器类接口Queue和LinkedList类。使用两个队列,一个是普通客户的队列,另一个是VIP用户的队列。


实现代码如下:

①:创建客户类:

public class Waiter {
 private int num;                        //客户排到的号码
 private int frontNum;                //客户前面还有多少人
 
 //生成set和get方法,对属性进行封装
 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;
 } 

}


②:创建Server类,表示现在已经有顾客已经排上好了队:

import java.util.*;

public class QueueServer {

 //实例一个普通客户队列 
  Queue<Waiter> waiterList = new LinkedList<Waiter>();
 
  //普通用户队列添加已经排好队的人
  public Queue<Waiter> init()
  {
  
   for(int i=1;i<=30;i++){
    Waiter w = new Waiter();
    w.setNum(i);
    w.setFrontNum(i-1);
    waiterList.offer(w);
   }
   return waiterList;
  }
}


现在创建UI类:

③:客户排队类:

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;

//如果前面的两个类和此类在同一个包则省略下面的import
import com.dr.Queue.QueueServer;
import com.dr.Queue.Waiter;

public class WaiterQueueUI {
 public static void main(String args[])
 {

//创建窗体,并设置窗体
  final Display display = Display.getDefault();
  final Shell shell = new Shell();
  
  shell.setText("俺们的客户端!");
  shell.setMaximized(true);
  
  QueueServer qs = new QueueServer();              //初始化server类
  final Queue<Waiter> waiterList = qs.init();           //初始化普通客户类
  final Queue<Waiter> waiterListVIP = qs.initVIP();        //初始化VIP客户类
  
  
  //初始化text容器
  final Text txt = new Text(shell,SWT.MULTI);
  txt.setBounds(400, 50, 500, 450);
  txt.setText("欢迎使用客户排队系统");
  
  final Button button = new Button(shell, SWT.Activate);        //实例化一个按钮
         
   //对这个按钮添加事件,先判断有没有VIP,然后再处理普通客户队列
  button.addSelectionListener(new SelectionAdapter() {
     public void widgetSelected(SelectionEvent e) {
       Waiter waiter = new Waiter();
       if(waiterListVIP.size() == 0)
       {
        waiter.setNum(waiterList.size()+1);
       }
       else
       {
        waiter.setNum(waiterList.size()+1);}
        waiter.setFrontNum(waiterList.size());
        waiterList.offer(waiter);
        int N = waiter.getNum()+waiterListVIP.size();
        int F = waiter.getFrontNum()+waiterListVIP.size();
        if(waiterList.size() <= 50){
         txt.setText( "您现在排在"+N+"位置上,\n您前面有"+F+"个人,"+"IVP用户为"+waiterListVIP.size()+"人\n请您耐心等候吧!哈哈");
        }else{
         txt.setText("您前面已经排50个人,请考虑!\n"+"您现在排在"+waiter.getNum()+"位置上,\n您前面有"+waiter.getFrontNum()+"个人\n请您耐心等候吧!哈哈");
        }
      }
     });
  button.setBounds(550, 530, 200, 75);
  button.setFont(new Font(display,"宋体",12,SWT.BOLD));
  button.setText("个人业务");
  
  
  final Button button1 = new Button(shell, SWT.Activate);                    //实例化VIP的按钮
  
//添加事件,并且对VIP队列进行处理
  button1.addSelectionListener(new SelectionAdapter() {
     public void widgetSelected(SelectionEvent e) {
   
      Waiter waiterVIP = new Waiter();      
      waiterVIP.setNum(waiterListVIP.size()+1);
      waiterVIP.setFrontNum(waiterListVIP.size());
      waiterListVIP.offer(waiterVIP);
      
       txt.setText( "您好尊贵的VIP用户,您现在排在VIP"+waiterVIP.getNum()+"号位置上,\n您前面有"+waiterVIP.getFrontNum()+"个VIP用户,\n请您耐心等候");
      
     }
     });
  button1.setBounds(750, 530, 200, 75);
  button1.setFont(new Font(display,"宋体",12,SWT.BOLD));
  button1.setText("金卡业务");
  
  shell.layout();
  shell.open();
  while (!shell.isDisposed()) {
   if (!display.readAndDispatch())
    display.sleep();
  }
  
 }

}



④:创建业务员使用的UI类:

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;

//如果前面的两个类和此类在同一个包则省略下面的import

import com.dr.Queue.QueueServer;
import com.dr.Queue.Waiter;

public class BankWorkerUI {
 public static void main(String args[])
 {

//创建窗体,并设置窗体
  final Display display = Display.getDefault();
  final Shell shell = new Shell();
  
  shell.setText("统统给我排好队!");
  
  QueueServer qs = new QueueServer();           //实例化QueueServer类
  final Queue<Waiter> waiterList = qs.init();   //初始化队列
  final Queue<Waiter> waiterListVIP = qs.initVIP();  //初始化VIP队列
  
    //初始化text容器
  final Text txt = new Text(shell,SWT.MULTI);
  txt.setBounds(65, 30, 180, 70);
  
  final Button button = new Button(shell,SWT.Activate);
  button.setBounds(90, 141, 100, 25);
  button.setText("下一个");
  
  
  //添加监听事件
  button.addSelectionListener(new SelectionAdapter()
  {
   public void widgetSelected(SelectionEvent e)
   {
    
    Waiter waiterVIP= waiterListVIP.poll();
    
    if(waiterVIP == null)
    {
     Waiter waiter = waiterList.poll();
     if(waiter!= null){
      txt.setText(waiter.getNum()+"号顾客请到1号窗口办理业务");
     }else{
      txt.setText("没有顾客办理业务了,休息一下.");
     }
    }
    else
    {
      txt.setText(waiterVIP.getNum()+"号VIP用户客请到1号窗口办理业务");
    }
   }
  });
  
  
  final Button buttonVIP = new Button(shell,SWT.Activate);
  buttonVIP.setBounds(190,141,100,25);
  buttonVIP.setText("VIP用户光临");
  buttonVIP.addSelectionListener(new SelectionAdapter()
  {
   public void widgetSelected(SelectionEvent e)
   {
    Waiter waiterVIP = new Waiter();      
    waiterVIP.setNum(waiterListVIP.size()+1);
    waiterVIP.setFrontNum(waiterListVIP.size());
    waiterListVIP.offer(waiterVIP);
   }
  });
  
  
  shell.layout();
  shell.open();
  while (!shell.isDisposed()) {
   if (!display.readAndDispatch())
    display.sleep();
  }
  
 }

}


运行的windows窗体如下:

一:排队的各种情况

初始窗口:                                                                                        当点击个人业务按钮即普通客户排队时:
   

点击金卡业务,即VIP用户前来排队时                                           当继VIP之后又一个普通用户前来排队时
   

二:业务员端使用情况

初始化的窗体:                                                                               点击两次下一个按钮后的情况,而第一次显示1号顾客正在办理
    

点击VIP光临,模拟VIP已经过来排上队了,但是窗口不反应,因为业务员不知道VIP前来,然后业务员继续点击下一个,则才能显示这个VIP用户,继续点击下一个按钮后VIP处理完毕,继续处理普通客户的业务


        





后记:通过这个小项目的实战,我学到了Quene接口的使用方法和加深了对监听事件的处理的印象,体现了分布式开发的思想

posted on 2010-10-31 21:45 Soap MacTavish 阅读(1358) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: