`
xurichusheng
  • 浏览: 346206 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

使用观察者模式监听系统参数的改变(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}

 

数据库数据 :


 

 

  • 大小: 3.7 KB
  • 大小: 4.3 KB
  • 大小: 5.5 KB
分享到:
评论

相关推荐

    设计模式-观察者

    观察者模式(Observer Pattern)是行为设计模式的一种,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 观察者模式的核心思想是发布-订阅模型,其中...

    Observer 观察者模式 示例 源码 ----设计模式

    观察者模式 概述 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 适用性 1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面。 将这二者封装...

    设计模式--观察者模式java例子

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于事件驱动的系统或者...

    iOS 设计模式 观察者模式

    在`ObserverPattern-master`这个压缩包中,可能包含了一个关于观察者模式的示例项目,里面可能通过创建自定义的观察者和被观察者类,展示了如何在不使用系统提供的通知或KVO的情况下实现观察者模式。通过分析和学习...

    HeadFirst 设计模式学习笔记2--观察者模式 demo

    例如,在Web开发中,可以使用观察者模式处理用户交互事件,当用户触发某个操作时,相关的监听器(观察者)会得到通知并执行相应的逻辑。 总的来说,HeadFirst设计模式的学习笔记2关于观察者模式的演示,旨在帮助...

    Cocos2d-x观察者模式其实很简单!!--之游戏开发《赵云要格斗》

    1. **观察者模式的基本概念**:观察者模式是一种行为设计模式,它让多个对象(观察者)订阅一个主题(被观察者),当主题状态改变时,会通知所有订阅者。在C++中,观察者通常是一个类,它实现了特定的回调接口。 2....

    java观察者模式demo----未使用java工具类

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在Java中,标准的观察者模式实现是...

    观察者模式模版和例子

    3. **事件驱动**:观察者模式非常适合构建事件驱动的系统,比如GUI框架,当用户进行交互时,事件可以被广播给多个监听者。 在编程实践中,观察者模式常用于以下场景: - **GUI组件**:当用户界面中的一个元素发生...

    Java内置观察者模式

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它允许一个对象,当其状态发生改变时,能够自动通知所有依赖它的其他对象。在Java中,这种模式已经被内置到语言核心,使得开发者可以轻松地实现事件驱动...

    观察者模式源码

    观察者模式(Observer Pattern)是软件设计模式的一种,属于行为型模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在Java中,观察者模式主要通过...

    设计模式之观察者模式Java实现

    观察者模式(Observer Pattern)是...在实际应用中,观察者模式可以用于诸如用户界面组件监听模型数据变化、订阅发布系统、事件处理框架等多种场景。通过这种方式,代码结构更加清晰,符合开闭原则,易于维护和扩展。

    设计模式专题之(十八)观察者模式---设计模式观察者模式示例代码(python--c++)

    观察者模式是软件设计模式中的一种行为模式,它允许一个对象,称为"主题",维护一个依赖于它的对象列表,这些对象被称为"观察者"。当主题的状态发生改变时,它会通知所有观察者,使它们能够自动更新自己。这种模式在...

    观察者模式使用

    观察者模式,也被称为发布-订阅(Publish-Subscribe)模式,是软件设计模式中的行为模式之一,主要用于对象间的一对多依赖关系管理。当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这个...

    观察者模式练习

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于事件驱动的系统或者...

    IOS 观察者模式实例Demo

    观察者模式(Observer Pattern)是其中的一种行为设计模式,它定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。在这个“IOS 观察者模式实例Demo”中...

    观察者模式1Demo

    观察者模式是软件设计模式中的一种行为模式,它在对象之间定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于事件处理、发布/订阅系统、以及...

    java 设计模式 观察者模式 简单实例 包括测试test类

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动或者发布...

    基于观察者模式两个activity通信

    观察者模式是一种行为设计模式,它允许一个对象(观察者)在另一个对象(被观察者)的状态改变时自动收到通知并进行相应处理。 首先,我们要理解观察者模式的基本概念。在观察者模式中,被观察者(Subject)是拥有...

    C++设计模式--观察者模式 demo

    - **使用观察者模式**:在`main`函数中,创建主体和观察者对象,将观察者添加到主体中,然后主体状态改变时调用`notify`方法,触发观察者的更新。 ```cpp int main() { ConcreteSubject subject; ConcreteObserver...

    java 了解观察者模式

    通过上述讨论,我们可以看到观察者模式在Java中的应用非常灵活,能够帮助我们构建松耦合、可扩展的系统。无论是简单的小型项目还是大型的企业级应用,都可以从中受益。理解并熟练运用观察者模式,可以提升代码的可...

Global site tag (gtag.js) - Google Analytics