5、xuzhenzhen.com.strategy包:MVC模式中的控制包
//策略接口
package xuzhenzhen.com.strategy;
public interface ServiceStrategy {
public void service(int counterNum);
}
//先来先服务策略模型
package xuzhenzhen.com.strategy;
import java.util.ArrayList;
import xuzhenzhen.com.model.CounterEntity;
import xuzhenzhen.com.model.StrategyEntity;
public class FcfsStrategy implements ServiceStrategy{
private ArrayList
list;//策略列表,存储经过FCFS策略后的结果
public
FcfsStrategy(ArrayList
list){
this.list=list;
}
@Override
public void service(int counterNum){//FCFS策略服务函数
if(counterNum<1)return;
CounterEntity counter=new CounterEntity(counterNum);
if(list.size()>0){
SortList sortList=new SortList(list);
sortList.sortByComeT();
for(int i=0;i
StrategyEntity temp=list.get(i);
int index=counter.getMinIndex();
float startT=Math.max(counter.get(index), temp.getComeT());
temp.setServiceID(index);
temp.setStartT(startT);
temp.computeTimes();
counter.set(index, temp.getEndT());
}
}
}
}
//短作业优先服务策略模型
package xuzhenzhen.com.strategy;
import java.util.ArrayList;
import xuzhenzhen.com.model.CounterEntity;
import xuzhenzhen.com.model.StrategyEntity;
public class SjfStrategy implements ServiceStrategy{
private ArrayList
list; //策略列表,存储经过SJF策略后的结果
public
SjfStrategy(ArrayList
list) {
this.list = list;
}
@Override
public void service(int counterNum) {//SJF策略服务函数
if(counterNum<1)return;
CounterEntity counter=new CounterEntity(counterNum);
if(list.size()>0){
SortList sortList=new SortList(list);
sortList.sortByComeT();
QueueList queue=new QueueList();
float now=list.get(0).getComeT();
int i=0;
int index;//服务台标号
while(i0){
while(i=list.get(i).getComeT()){//加入到队列中
queue.add(list.get(i));
i++;
}
if(queue.size()<=0&&i
queue.add(list.get(i));
i++;
}
StrategyEntity entity=queue.popMin();
if(entity!=null){
index=counter.getMinIndex();
float startT=Math.max(counter.get(index),entity.getComeT());
entity.setServiceID(index);
entity.setStartT(startT);
entity.computeTimes();
counter.set(index, entity.getEndT());
}
now=counter.getMin();
}
}
}
}
//高响应比优先服务策略模型
package xuzhenzhen.com.strategy;
import java.util.ArrayList;
import xuzhenzhen.com.model.CounterEntity;
import xuzhenzhen.com.model.StrategyEntity;
public class FpfStrategy implements ServiceStrategy{
private
ArrayListlist;
//策略列表,存储经过FPF策略后的结果
public
FpfStrategy(ArrayList
list) {
this.list = list;
}
@Override
public void service(int counterNum) {//FPF策略服务函数
// TODO Auto-generated method stub
if(counterNum<1)return;
CounterEntity counter=new CounterEntity(counterNum);
if(list.size()>0){
SortList sortList=new SortList(list);
sortList.sortByComeT();
QueueList queue=new QueueList();
float now=list.get(0).getComeT();
int i=0;
int index;//服务台标号
while(i0){
while(i=list.get(i).getComeT()){//加入到队列中
queue.add(list.get(i));
i++;
}
if(queue.size()<=0&&i
queue.add(list.get(i));
i++;
}
StrategyEntity entity=queue.popFpfMax(now);
if(entity!=null){
index=counter.getMinIndex();
float startT=Math.max(counter.get(index),entity.getComeT());
entity.setServiceID(index);
entity.setStartT(startT);
entity.computeTimes();
counter.set(index, entity.getEndT());
}
now=counter.getMin();
}
}
}
}
//排队列表类,用来对顾客进行排队的类
package xuzhenzhen.com.strategy;
import java.util.ArrayList;
import xuzhenzhen.com.model.StrategyEntity;
public class QueueList {
private ArrayList
list;
public QueueList(){
list=new
ArrayList();
}
public int size(){
return list.size();
}
public void add(StrategyEntity entity){
list.add(entity);
}
public StrategyEntity popMin(){//移除服务时间最短的顾客
int size=list.size();
if(size>0){
int index=0;
float MinT=list.get(0).getServiceT();
for(int i=1;i
if(MinT>list.get(i).getServiceT()){
MinT=list.get(i).getServiceT();
index=i;
}
}
return list.remove(index);
}
return null;
}
public StrategyEntity popFpfMax(float now){//移除响应比最大的顾客
int size=list.size();
if(size>0){
int index=0;
float max=getFpfWeight(now, list.get(0));
for(int i=1;i
float weight=getFpfWeight(now, list.get(i));
if(max
max=weight;
index=i;
}
}
return list.remove(index);
}
return null;
}
public float getFpfWeight(float now,StrategyEntity entity){
return 1+(now-entity.getComeT())/entity.getServiceT();
}
}
//排序类,对顾客按照规则排序的类
package xuzhenzhen.com.strategy;
import java.util.ArrayList;
import xuzhenzhen.com.model.StrategyEntity;
public class SortList {
private ArrayList
list;
public
SortList(ArrayList
list) {
this.list = list;
}
public void sortByComeT(){
int size=list.size();
boolean isChange;
for(int i=0;i
isChange=false;
for(int j=size-1;j>=i+1;j--){
if(compareEntity(j-1, j)){
swapEntity(j, j-1);
isChange=true;
}
if(!isChange)return;
}
}
}
public boolean compareEntity(int i,int j){
float temp1=list.get(i).getComeT();
float temp2=list.get(j).getComeT();
return temp1>temp2;
}
public void swapEntity(int i,int j){
StrategyEntity temp=list.set(i,list.get(j));
list.set(j, temp);
}
}
6、xuzhenzhen.com.factory包:工厂包,通过文件来制造模型
//顾客工厂类,在文件中读取顾客信息,用来初始化顾客的类
package xuzhenzhen.com.factory;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import xuzhenzhen.com.model.CustomEntity;
public class EntityFactory {
public ArrayList
getEntity(){
ArrayList list=new
ArrayList();
OpenFile open=new OpenFile("打开");
File file=open.openFile();
BufferedReader input=null;
if(file==null)return null;
try {
input=new BufferedReader(
new FileReader(file));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("读取文件失败!");
e.printStackTrace();
}
try {
String value;
while((value=input.readLine())!=null){
String[] temp=value.split("[ \t]");//拆分字符串按空格和制表符
if(temp.length!=3)return null;
String id=temp[0];
float cT=Float.parseFloat(temp[1]);
float sT=Float.parseFloat(temp[2]);
CustomEntity cus=new CustomEntity(id, cT, sT);
list.add(cus);
}
input.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
}
//文件匹配类,用来匹配正确的初始化文件
package xuzhenzhen.com.factory;
import java.io.File;
import javax.swing.filechooser.FileFilter;
public class MyFileFilter extends FileFilter{
private String ext;
public MyFileFilter(String ext) {
super();
this.ext = ext;
}
@Override
public boolean accept(File file) {
// TODO Auto-generated method stub
if(file.isDirectory())
return true;
String fileName=file.getName();
int index=fileName.lastIndexOf('.');
if(index>0&&index
String extension=fileName.substring(index+1).toLowerCase();
if(extension.equals(ext))
return true;
}
return false;
}
@Override
public String getDescription() {
// TODO Auto-generated method stub
if(ext.equals("txt"))
return "文本文件(*.txt)";
return "";
}
}
//文件浏览器类,用来打开指定文件
package xuzhenzhen.com.factory;
import java.io.File;
import javax.swing.JFileChooser;
public class OpenFile {
private String btnStr;
public OpenFile(String s){
this.btnStr=s;
}
public File openFile(){
File file=null;
JFileChooser fileChooser=new JFileChooser("D:\");
fileChooser.addChoosableFileFilter(new MyFileFilter("txt"));
int result=fileChooser.showDialog(null,btnStr);
if(result==JFileChooser.APPROVE_OPTION){
file=fileChooser.getSelectedFile();
}
return file;
}
}
7、xuzhenzhen.com.menu包:菜单包,集成所有的菜单选项类
//文件菜单类,封装了文件菜单中的子菜单
package xuzhenzhen.com.menu;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
public class FileMenu extends JMenu{
private static final long serialVersionUID =
7796528198277716694L;
private JMenuItem openItem;
private JMenuItem saveItem;
private JMenuItem exitItem;
public FileMenu(){
super("文件");
setMnemonic('F');
init();
}
public void init(){
openItem=new JMenuItem("打开",new ImageIcon("icons/open.gif"));
saveItem=new JMenuItem("保存",new ImageIcon("icons/save.gif"));
exitItem=new JMenuItem("退出");
openItem.setAccelerator(KeyStroke.getKeyStroke('O',
java.awt.Event.CTRL_MASK, false));
saveItem.setAccelerator(KeyStroke.getKeyStroke('S',
java.awt.Event.CTRL_MASK, false));
exitItem.setAccelerator(KeyStroke.getKeyStroke('X',
java.awt.Event.CTRL_MASK, false));
add(openItem);
add(saveItem);
addSeparator();
add(exitItem);
}
public void addListener(ActionListener l){
openItem.addActionListener(l);
saveItem.addActionListener(l);
exitItem.addActionListener(l);
}
}
//操作菜单类,封装了用于操作的子菜单
package xuzhenzhen.com.menu;
import java.awt.event.ActionListener;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
public class OperationMenu extends JMenu{
private static final long serialVersionUID =
1739915004810336972L;
private JMenuItem FCFSItem;
private JMenuItem SJFItem;
private JMenuItem FPFItem;
public OperationMenu() {
super("操作");
init();
}
public void init(){
FCFSItem=new JMenuItem("先来先服务");
SJFItem=new JMenuItem("短作业优先服务");
FPFItem=new JMenuItem("高响应比优先服务");
FCFSItem.setAccelerator(KeyStroke.getKeyStroke('F',
java.awt.Event.ALT_MASK, false));
SJFItem.setAccelerator(KeyStroke.getKeyStroke('S',
java.awt.Event.ALT_MASK, false));
FPFItem.setAccelerator(KeyStroke.getKeyStroke('P',
java.awt.Event.ALT_MASK, false));
add(FCFSItem);
add(SJFItem);
add(FPFItem);
}
public void addListener(ActionListener l){
FCFSItem.addActionListener(l);
SJFItem.addActionListener(l);
FPFItem.addActionListener(l);
}
}
//设置菜单类,封装了用于设置的子菜单
package xuzhenzhen.com.menu;
import java.awt.event.ActionListener;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
public class SettingMenu extends JMenu{
private static final long serialVersionUID =
-721137626887704367L;
private JMenuItem setCounterItem;//设置服务台个数
public SettingMenu(){
super("设置");
init();
}
public void init(){
setCounterItem=new JMenuItem("设置服务台");
setCounterItem.setAccelerator(KeyStroke.getKeyStroke('R',
java.awt.Event.CTRL_MASK, false));
add(setCounterItem);
}
public void addListener(ActionListener l){
setCounterItem.addActionListener(l);
}
}
8、xuzhenzhen.com.view包:MVC模式中的视图层,用来显示模型
//主窗体类,用来显示主窗体
package xuzhenzhen.com.view;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JOptionPane;
import xuzhenzhen.com.menu.FileMenu;
import xuzhenzhen.com.menu.OperationMenu;
import xuzhenzhen.com.menu.SettingMenu;
public class MainFrame extends JFrame implements
ActionListener{
private static final long serialVersionUID =
5976758585383446855L;
private JMenuBar bar;
private FileMenu fileMenu;//文件菜单
private SettingMenu settingMenu;//设置菜单
private OperationMenu operationMenu;//操作菜单
private MainTabbedPane panel;//主面板
public MainFrame(){
init();
}
public void init(){//初始化主窗体中的对象
bar=new JMenuBar();
fileMenu=new FileMenu();
settingMenu=new SettingMenu();
operationMenu=new OperationMenu();
fileMenu.addListener(this);
settingMenu.addListener(this);
operationMenu.addListener(this);
bar.add(fileMenu);
bar.add(settingMenu);
bar.add(operationMenu);
setJMenuBar(bar);
panel=new MainTabbedPane();
this.setContentPane(panel);
this.setTitle("排队系统分析软件");
this.setSize(800, 600);
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
this.setLocationRelativeTo(null);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent arg0) {
// TODO Auto-generated method stub
dealQuit();
}
});
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String event=e.getActionCommand();
if(event.equals("打开")) dealOpen();
if(event.equals("保存")) dealSave();
if(event.equals("退出")) dealQuit();
if(event.equals("设置服务台"))dealSetting();
if(event.equals("先来先服务"))panel.operateFcfs();
if(event.equals("短作业优先服务"))panel.operateSjf();
if(event.equals("高响应比优先服务"))panel.operateFpf();
}
public void dealQuit(){
int result=JOptionPane.showConfirmDialog(null, "是否退出软件?", "提示",
JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE);
if(result==JOptionPane.YES_OPTION){
System.exit(0);
}
}
public void dealOpen(){
panel.loadFromFile();
}
public void dealSave(){
}
public void dealSetting(){
SetCounterDialog dialog=new
SetCounterDialog(panel.getServiceCount());
panel.setServiceCount(dialog.getCounterValue());
}
}
//主面板类,用来封装顾客表格和策略表格
package xuzhenzhen.com.view;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import javax.swing.JTabbedPane;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import xuzhenzhen.com.control.CustomListener;
import xuzhenzhen.com.factory.EntityFactory;
import xuzhenzhen.com.model.CustomEntity;
public class MainTabbedPane extends JTabbedPane implements
CustomListener,ChangeListener{
private static final long serialVersionUID =
6749334923783628548L;
private ArrayList
list;//顾客列表
private int serviceCount=1;//服务台个数
private CustomPanel customPane;//顾客面板
private ResultPanel fcfsPane;//FCFS面板
private ResultPanel sjfPane;//SJF面板
private ResultPanel fpfPane;//FPF面板
private boolean isChange=false;//顾客属性是否改变的标志
public MainTabbedPane(){
init();
}
public void init(){//初始化主面板
customPane=new CustomPanel();
fcfsPane=new ResultPanel();
sjfPane=new ResultPanel();
fpfPane=new ResultPanel();
add("顾客到达表", customPane);
add("FCFS表",fcfsPane);
add("SJF表",sjfPane);
add("FPF表",fpfPane);
addChangeListener(this);
}
public void loadFromFile(){//在文件中加载顾客到达情况
EntityFactory factory=new EntityFactory();
if(factory!=null){
list=factory.getEntity();
if(list!=null)customPane.setTableModel(this, list);
else{
JOptionPane.showMessageDialog(null, "文件格式错误!", "警告",
JOptionPane.ERROR_MESSAGE);
}
}
}
public void operateFcfs(){//执行FCFS策略
if(list!=null){
if(!isChange)fcfsPane.oprateService(list, serviceCount,1);
setSelectedIndex(1);
}
}
public void operateSjf(){//执行SJF策略
if(list!=null){
if(!isChange)sjfPane.oprateService(list, serviceCount,2);
setSelectedIndex(2);
}
}
public void operateFpf(){//执行FPF策略
if(list!=null){
if(!isChange)fpfPane.oprateService(list, serviceCount,3);
setSelectedIndex(3);
}
}
public int getServiceCount() {
return serviceCount;
}
public void setServiceCount(int serviceCount) {
this.serviceCount = serviceCount;
}
@Override
public void customDataChanged() {
// TODO Auto-generated method stub
this.isChange=true;
}
@Override
public void stateChanged(ChangeEvent arg0) {
// TODO Auto-generated method stub
if(isChange&&list!=null){
int index=this.getSelectedIndex();
if(index>0){
int result=JOptionPane.showConfirmDialog(null, "列表已更新,是否重新运行算法?",
"提示",
JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE);
if(result==JOptionPane.YES_OPTION){
isChange=false;
fcfsPane.oprateService(list, serviceCount,1);
sjfPane.oprateService(list, serviceCount,2);
fpfPane.oprateService(list, serviceCount,3);
}
}
}
}
}
//顾客面板类,用来显示顾客到达情况的面板
package xuzhenzhen.com.view;
import java.awt.BorderLayout;
import java.util.ArrayList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import xuzhenzhen.com.control.CustomListener;
import xuzhenzhen.com.model.CustomEntity;
import xuzhenzhen.com.tablemodel.CustomTableModel;
public class CustomPanel extends JPanel{
private static final long serialVersionUID =
-8497054290255576000L;
private CustomTableModel model;//顾客表单模型
private JTable table;//表格,用来显示顾客表单模型
private JScrollPane panel;
public CustomPanel(){
table=new JTable();
table.getTableHeader().setReorderingAllowed(false);
panel=new JScrollPane(table);
setLayout(new BorderLayout());
add(panel,BorderLayout.CENTER);
}
public CustomPanel(CustomListener
l,ArrayList list){
model=new CustomTableModel(l, list);
table=new JTable(model);
table.getTableHeader().setReorderingAllowed(false);
panel=new JScrollPane(table);
setLayout(new BorderLayout());
add(panel,BorderLayout.CENTER);
}
public void setTableModel(CustomListener
l,ArrayList list){
model=new CustomTableModel(l, list);
table.setModel(model);
this.validate();
}
}
//结果面板类,用来显示策略的结果
package xuzhenzhen.com.view;
import java.awt.BorderLayout;
import java.util.ArrayList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import xuzhenzhen.com.model.CustomEntity;
import xuzhenzhen.com.tablemodel.StrategyTableModel;
public class ResultPanel extends JPanel{
private static final long serialVersionUID =
-6825335095647863360L;
private StrategyTableModel model;//策略模型
private JTable table;//用来显示策略模型
private JScrollPane panel;
public ResultPanel(){
table=new JTable();
table.getTableHeader().setReorderingAllowed(false);
panel=new JScrollPane(table);
setLayout(new BorderLayout());
add(panel,BorderLayout.CENTER);
}
public void
oprateService(ArrayList
list,int num,int strategyKey){
model=new StrategyTableModel(list);
model.doService(num,strategyKey);
table.setModel(model);
this.validate();
}
}
//设置服务台个数的输入框类
package xuzhenzhen.com.view;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class SetCounterDialog implements ActionListener{
private JDialog dialog;
private JTextField counterNum;
private JButton OKBtn;
private JButton cancelBtn;
private int counterCount;
public SetCounterDialog(int counterCount) {
this.counterCount = counterCount;
init();
}
public void init(){
dialog = new JDialog(new JDialog(),"设置服务台个数",true);
counterNum=new JTextField();
counterNum.setText(this.counterCount+"");
OKBtn=new JButton("确定");
cancelBtn=new JButton("取消");
OKBtn.addActionListener(this);
cancelBtn.addActionListener(this);
dialog.setLayout(new BorderLayout());
JPanel panel=new JPanel(new GridLayout(1, 2,1,2));
panel.add(new JLabel("服务台个数:",JLabel.CENTER));
panel.add(counterNum);
JPanel btnPanel=new JPanel(new GridLayout(1, 2));
btnPanel.add(OKBtn);
btnPanel.add(cancelBtn);
dialog.add(panel,BorderLayout.CENTER);
dialog.add(btnPanel,BorderLayout.SOUTH);
dialog.setSize(200, 100);
dialog.setResizable(false);
dialog.setLocationRelativeTo(null);
dialog.setVisible(true);
}
public int getCounterValue(){
return this.counterCount;
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String event=e.getActionCommand();
if(event.equals("确定")){
try {
int temp=Integer.parseInt(counterNum.getText());
this.counterCount=temp;
dialog.dispose();
} catch (Exception e2) {
// TODO: handle exception
JOptionPane.showMessageDialog(null, "数据输入错误!",
"警告",JOptionPane.ERROR_MESSAGE);
}
}
if(event.equals("取消")){
dialog.dispose();
}
}
}