使用观察者模式监听系统参数的改变(1)--新增

 

可以先阅读  使用观察者模式监听Map值的改变

 

1. 数据库表 sys_params

 

   数据库为: oracle 10g2

 

create table SYS_PARAMS
(
  PARAM_ID    VARCHAR2(36) PRIMARY KEY,
  PARAM_NAME  VARCHAR2(20) not null,
  PARAM_VALUE VARCHAR2(20) not null,
  PARAM_DESC  VARCHAR2(100)
);

 

 

 

INSERT INTO SYS_PARAMS
VALUES
  (SYS_GUID(),
   'a定时任务时间',
   TO_CHAR(SYSDATE, 'yyyy-MM-dd HH24:mi:ss'),
   '');
COMMIT;

 

 

 

2. 实体类 SysParamsPO, 实体类即为观察者对象

 

import java.util.Observable;
import java.util.Observer;

public class SysParamsPO implements Observer {
	
	// 主键
	private String paramId;
	
	// 系统参数名
	private String paramName;	
	
	// 系统参数值
	private String paramValue;

	// 描述
	private String paramDesc;

	@Override
	public void update(Observable o, Object arg) {
		System.out.println("update:" + arg);
	}

	// 省略 getter()/setter()
}

 

 

3. 定义一个全局Map,用来存放系统参数

 

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public final class CommonConstants {

	private CommonConstants() {
	}
	
	/** 系统参数 */
	public static Map<String, Object> sysParamsMap = new ConcurrentHashMap<String, Object>(16);
}

 

 

4. 在servlet的init()方法中查找表 SYS_PARAMS 的数据,存入CommonConstants.sysParamsMap中

  (这里就不写了,比较简单)

 

5. 定义一个被观察者对象(Observable),用来监控对系统参数的新增

 

import java.util.Iterator;
import java.util.Map;
import java.util.Observable;
import java.util.Observer;
import java.util.concurrent.ConcurrentHashMap;

public final class SysParamsObservable extends Observable {

	private static final SysParamsObservable instance = new SysParamsObservable();

	protected Map<String, Object> obs = new ConcurrentHashMap<String, Object>();

	private SysParamsObservable() {
	}

	public static SysParamsObservable getInstance() {
		return instance;
	}

	/**
	 * @Title: doBusiness
	 * @Description: 当被观察者有Changed时,通知观察者
	 * @param arg
	 * @author
	 * @date 2013-5-2
	 */
	public void doBusiness(Object arg) {
		// 设置修改状态
		super.setChanged();
		// 通知观察者
		this.notifyObservers(arg);
	}

	/**
	 * @Title: notifyObservers
	 * @Description: 模仿不同的业务通知对应业务的观察者
	 * @param arg
	 * @see java.util.Observable#notifyObservers(java.lang.Object)
	 * @author
	 */
	public void notifyObservers(Object arg) {

		String msg = arg.toString();

		String[] msgs = msg.split(":");

		if (obs.containsKey(msgs[0])) {
			Observer ob = (Observer) obs.get(msgs[0]);
			ob.update(this, msgs[1]);
		}
	}

	/**
	 * @Title: addObserver
	 * @Description: 添加一个观察者
	 * @param name
	 *            观察者名称
	 * @param o
	 *            观察者对象
	 * @author
	 * @date 2013-5-2
	 */
	public synchronized void addObserver(SysParamsPO po) {

		System.out.println("添加一个系统参数:" + po.getParamName());

		CommonConstants.sysParamsMap.put(po.getParamName(), po.getParamValue());
	}

	/**
	 * @Title: updateObserver
	 * @Description: 修改一个观察者
	 * @param name
	 *            观察者名称
	 * @param o
	 *            :观察者对象
	 * @author
	 * @date 2013-5-2
	 */
	public synchronized void updateObserver(String name, Observer o) {

		Iterator<String> it = obs.keySet().iterator();

		String key = null;

		while (it.hasNext()) {

			key = it.next();

			if (key.equals(name)) {
				System.out.println("被修改的key为:" + key);
				obs.put(key, o);
				break;
			}
		}
	}

	/**
	 * @Title: deleteObserver
	 * @Description: 删除观察者
	 * @param o
	 *            : 观察者对象
	 * @see java.util.Observable#deleteObserver(java.util.Observer)
	 * @author
	 */
	public synchronized void deleteObserver(Observer o) {

		if (obs.values().contains(o)) {

			Iterator<String> it = obs.keySet().iterator();

			String key = null;

			while (it.hasNext()) {

				key = it.next();

				if (obs.get(key).equals(o)) {
					System.out.println("被删除的key为:" + key);
					obs.remove(key);
					break;
				}
			}
		}
	}
}

 

其中的方法addObserver,即为监控新增操作的方法。

 

6. service层方法

    先插入数据库中,再放入CommonConstants.sysParamsMap中

public void add(SysParamsPO po) throws Exception {

	po.setParamId(UUID.randomUUID().toString());
	sysparamsDAO.insert(po);

	// 实例化一个被观察者
	SysParamsObservable able = SysParamsObservable.getInstance();

	// 添加观察者
	able.addObserver(po);

	logger.info("添加后,系统参数为:" + CommonConstants.sysParamsMap);
}

 

7. action 层方法(Struts2框架)

public void addSysParamsPO() {
	try {
		sysparamsService.add(sysParamsPO);
	} catch (Exception e) {
		e.printStackTrace();
	}
}

 

8. 新增系统参数页面



 

运行结果:

添加一个系统参数:a11
2013-05-07 15:13:36,069 [INFO] cn.com.do1.component.sysparams.sysparams.service.impl.SysparamsServiceImpl.add(SysparamsServiceImpl.java:107) 添加后,系统参数为:{a11=1.1, a定时任务时间=2013-05-07 15:11:01}

 

数据库数据 :


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值