观测者模式已在博客"设计模式之观测者模式"中介绍,下面说下如何将观察者模式应用在实际工作中。
问题描述
某业务系统会定期接收到传回来的数据,数据放在一个目录下。由于业务的需要,当有新的数据产生时,需要将数据上传到多台机器上。你如何设计这个业务逻辑呢?
功能设计
放在目录下的数据时不断更新的,我们需要一个守护线程来监控目录下数据的变化,当有新数据时就通知观测者observers。这里的观测者是需要将数据上传到FTP服务器的对象,当有新数据产生时,就上传数据到FTP服务器。
这里很适合用观测者模式来解决,其中subject的功能是监控目录变化,和通知观测者变化的数据。观测者的功能是上传新的数据到FTP服务器,这里有多个观测者,而且虽这业务的发展,观察者的数目是变化的。
采用观测者模式,可以在不修改代码的情况下,很容易的添加观测者。
详细设计
监控目录变化的subject:
import java.io.File;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Observable;
import zyang.designPattern.observerPattern.Observer;
import zyang.designPattern.observerPattern.Subject;
/**
* Fuction:
* 一个守护线程,用户监控目录下是否有新数据
* 如果有新数据,通知监听对象observers
* @author zhonghua
* @version 2013-3-20 下午9:25:56
* @since 1.0
*/
public class DirectoryMonitorSubject extends Observable implements Runnable {
// -------------------------------------------------
// properties
// -------------------------------------------------
/**
* Whether or not this thread is active.
*/
private boolean active = false;
/**
* The interval in seconds to run this thread
*/
private int interval = -1;
/**
* The name of this thread
*/
private String threadName;
/**
* This instance's thread
*/
private Thread runner;
/**
* 监控目录
*/
private String directoryFullPath;
/**
* The map of last recorded files and their timestamps (String fileName => Long lastMod)
*/
private Map prevDatas=new HashMap<String, Long>();
/**
* The map of current files and their timestamps (String fileName => Long lastMod)
*/
private Map currentDatas=new HashMap<String, Long>();