此程序爲觀察者模式:
首先定義兩個類,一個是抽象類:BaseEvent,一個是繼承該抽象類的類AlarmEvent;
代碼如下:
BaseEvent類
:
package cams.alarm_manage.core.event;
public abstract class BaseEvent {
private String error;
private Object result;
public String getError() {
return error;
}
public void setError(String error) {
this.error = error;
}
public Object getResult() {
return result;
}
public void setResult(Object result) {
this.result = result;
}
public boolean isError(){
return !error.equals("");
}
}
AlarmEvent 類:
package cams.alarm_manage.core.event;
import javax.swing.JComboBox;
import twaver.AlarmVisibleFilter;
import twaver.TDataBox;
public class AlarmEvent extends BaseEvent {
private TDataBox totalBox;
private JComboBox combobox;
private AlarmVisibleFilter filter;
private String netType;
private String areaName;
public String getAreaName() {
return areaName;
}
public void setAreaName(String areaName) {
this.areaName = areaName;
}
public String getNetType() {
return netType;
}
public void setNetType(String netType) {
this.netType = netType;
}
public JComboBox getCombobox() {
return combobox;
}
public void setCombobox(JComboBox combobox) {
this.combobox = combobox;
}
public AlarmVisibleFilter getFilter() {
return filter;
}
public void setFilter(AlarmVisibleFilter filter) {
this.filter = filter;
}
public AlarmEvent(){
}
public AlarmEvent(TDataBox totalBox){
setTotalBox(totalBox);
}
public AlarmEvent(JComboBox combobox,AlarmVisibleFilter filter){
setCombobox(combobox);
setFilter(filter);
}
public TDataBox getTotalBox() {
return totalBox;
}
public void setTotalBox(TDataBox totalBox) {
this.totalBox = totalBox;
}
}
管理event的類:
eventManager類:
package cams.alarm_manage.core.common;
import java.util.*;
import cams.alarm_manage.core.event.BaseEvent;
import cams.alarm_manage.core.listener.ViewListener;
public class EventManager {
private static EventManager mgr;
private EventManager() {
}
public static EventManager getInstance() {
if (mgr == null) {
synchronized (EventManager.class) {
mgr = new EventManager();
}
}
return mgr;
}
public void over() {
if (mgr != null) {
synchronized (EventManager.class) {
mgr = null;
}
}
}
private List<ViewListener> listeners = new ArrayList<ViewListener>();
public void addListener(ViewListener listener) {
listeners.add(listener);
}
public void removeListener(ViewListener listener) {
listeners.remove(listener);
}
public void dispatch(BaseEvent event){
fireEventCompleted(event);
}
private void fireEventCompleted(BaseEvent event) {
for (ViewListener listener : listeners) {
listener.eventCompleted(event);
}
}
}
EventManager主要的作用是遍歷所有的觀察者:將所有的baseEvent事件全部回調,
回調的類如下:
AlarmToolPanel類中的刷新方法:
//刷新按鈕
alarmRefreshButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
Thread thread = new Thread(new Runnable() {
public void run() {
glassPane.start();
glassPane.setText("正在刷新數據請稍候....");
BoxManage.getInstance().updateAlarmInfo();
//event用來傳遞屬性且爲局部變量無需主動釋放
EventManager.getInstance().dispatch(new AlarmEvent(BoxManage.getTotalBox()));
SwingUtilities.invokeLater(new Runnable(){
public void run() {
glassPane.stop();
}
});
}
});
thread.start();
}
});
然後通過BoxManager來管理各個box中的數據:
package cams.alarm_manage.core.common;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import javax.swing.SwingUtilities;
import twaver.AlarmModelEvent;
import twaver.AlarmModelListener;
import twaver.TDataBox;
import cams.alarm_manage.alarmBan.AlarmFilterFactory;
import cams.alarm_manage.alarmOperation.factory.AlarmOperationFactory;
import cams.area.service.AreaService;
import cams.topo_manage.TopoMain;
public class BoxManage implements AlarmModelListener,PropertyChangeListener {
private static TDataBox ipBox;
private static TDataBox switchBox;
private static BoxManage manage;
private boolean updateState = true;
private BoxManage(){
}
/*
* 得到同步的IP網管數據箱
*/
public synchronized static TDataBox getIpBox() {
if (ipBox == null) {
ipBox = new TDataBox();
}
return ipBox;
}
/*
* 得到同步的交換網管數據箱
*/
public synchronized static TDataBox getSwitchBox() {
if (switchBox == null) {
switchBox = new TDataBox();
}
return switchBox;
}
/*
* 得到同步的所有網管數據箱
*/
public static TDataBox getTotalBox(){
TDataBox tempBox = new TDataBox();
tempBox.getAlarmModel().addAlarms(BoxManage.getSwitchBox().getAlarmModel().getAllAlarms());
tempBox.getAlarmModel().addAlarms(BoxManage.getIpBox().getAlarmModel().getAllAlarms());
return tempBox;
}
public synchronized static BoxManage getInstance(){
if(manage == null){
manage = new BoxManage();
}
return manage;
}
/*
* 初始化告警信息,連接數據庫查詢各個專業網管的告警信息並放入相應數據箱內
*/
public void initAlarmInfo() {
AreaService area = new AreaService();
List switchList = AlarmOperationFactory.getAlarmOperation().getCurrentAlarmInfo("1");
BoxManage.getSwitchBox().addElements(area.getHideNode().getAllElements());
BoxManage.getSwitchBox().getAlarmModel().addAlarms(switchList);
List ipList = AlarmOperationFactory.getAlarmOperation().getCurrentAlarmInfo("2");
BoxManage.getIpBox().addElements(area.getHideNode().getAllElements());
BoxManage.getIpBox().getAlarmModel().addAlarms(ipList);
}
/*
* 更新告警信息,連接數據庫同步數據
*/
public void updateAlarmInfo(){
BoxManage.getInstance().updateState = false;
BoxManage.getInstance().removeAlarmListener();
final List switchList = AlarmOperationFactory.getAlarmOperation().getCurrentAlarmInfo("1");
final List ipList = AlarmOperationFactory.getAlarmOperation().getCurrentAlarmInfo("2");
SwingUtilities.invokeLater(new Runnable(){
public void run() {
BoxManage.getIpBox().getAlarmModel().clear();
BoxManage.getIpBox().getAlarmModel().addAlarms(ipList);
BoxManage.getSwitchBox().getAlarmModel().clear();
BoxManage.getSwitchBox().getAlarmModel().addAlarms(switchList);
AlarmFilterFactory.getInstance().getCurrentAlarmInfo();
TopoMain.getInstance().updateDataBox();
BoxManage.getInstance().addAlarmListener();
BoxManage.getInstance().updateState = true;
}
});
}
/*
* 爲各個專業網管添加告警屬性變化監聽和告警變化監聽
*/
public void addAlarmListener(){
BoxManage.getIpBox().getAlarmModel().addAlarmModelListener(this);
BoxManage.getSwitchBox().getAlarmModel().addAlarmModelListener(this);
BoxManage.getIpBox().getAlarmModel().addAlarmPropertyChangeListener(this);
BoxManage.getSwitchBox().getAlarmModel().addAlarmPropertyChangeListener(this);
}
/*
* 移除各個專業網管的監聽
*/
public void removeAlarmListener(){
BoxManage.getIpBox().getAlarmModel().removeAlarmModelListener(this);
BoxManage.getSwitchBox().getAlarmModel().removeAlarmModelListener(this);
BoxManage.getIpBox().getAlarmModel().removeAlarmPropertyChangeListener(this);
BoxManage.getSwitchBox().getAlarmModel().removeAlarmPropertyChangeListener(this);
}
/*
* 實現了告警屬性變化監聽接口
*/
public void propertyChange(PropertyChangeEvent event) {
SwingUtilities.invokeLater(new Runnable(){
public void run() {
AlarmFilterFactory.getInstance().getCurrentAlarmInfo();
}
});
}
/*
* 實現了告警變化監聽接口
*/
public void alarmAdded(AlarmModelEvent event) {
SwingUtilities.invokeLater(new Runnable(){
public void run() {
AlarmFilterFactory.getInstance().getCurrentAlarmInfo();
TopoMain.getInstance().updateDataBox();
}
});
}
/*
* 實現了告警變化監聽接口
*/
public void alarmCleared(AlarmModelEvent event) {
}
/*
* 實現了告警變化監聽接口
*/
public void alarmRemoved(AlarmModelEvent event) {
SwingUtilities.invokeLater(new Runnable(){
public void run() {
AlarmFilterFactory.getInstance().getCurrentAlarmInfo();
TopoMain.getInstance().updateDataBox();
}
});
}
/*
* 返回告警是否正在更新(當刷新告警事件開始時爲fasle結束時爲true)
*/
public boolean isUpdateState() {
return updateState;
}
}
所有的類都已經添加完畢:
下面解釋一下這幾個類的關聯關係: