此程序为观察者模式:
首先定义两个类,一个是抽象类: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;
}
}
所有的类都已经添加完毕:
下面解释一下这几个类的关联关系: