天天看點

使用觀察者模式監聽系統參數的改變(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;
           
使用觀察者模式監聽系統參數的改變(1)--新增

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. 新增系統參數頁面

使用觀察者模式監聽系統參數的改變(1)--新增

運作結果:

添加一個系統參數: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}
           

資料庫資料 :

使用觀察者模式監聽系統參數的改變(1)--新增

繼續閱讀