设计模式:如何使用观测者模式实现监控和推送

       观测者模式已在博客"设计模式之观测者模式"中介绍,下面说下如何将观察者模式应用在实际工作中。

问题描述

       某业务系统会定期接收到传回来的数据,数据放在一个目录下。由于业务的需要,当有新的数据产生时,需要将数据上传到多台机器上。你如何设计这个业务逻辑呢?

功能设计

       放在目录下的数据时不断更新的,我们需要一个守护线程来监控目录下数据的变化,当有新数据时就通知观测者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>();
    
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
观察者模式(Observer Pattern)和发布-订阅模式(Publish-Subscribe Pattern)都是软件设计模式,用于构建松散耦合的系统。它们的主要区别在于: 1. 目标(Subject)和观察者(Observer)之间的关系 在观察者模式中,目标和观察者之间是一对多的关系,即一个目标可以有多个观察者。观察者订阅目标的通知,当目标发生变化时,观察者会接收到通知并进行相应的处理。 在发布-订阅模式中,发布者(Publisher)和订阅者(Subscriber)之间是一对多的关系,即一个发布者可以有多个订阅者。发布者不会直接向订阅者发送消息,而是将消息发送到一个消息中心(Message Broker)中心,消息中心再将消息广播给所有订阅者。 2. 通信方式 在观察者模式中,目标和观察者之间是直接通信的,即目标会调用观察者的方法来通知它们。这种通信方式是同步的,即目标会等待所有观察者处理完通知后再继续执行。 在发布-订阅模式中,发布者和订阅者之间是通过消息中心进行间接通信的,即发布者将消息发送到消息中心,消息中心再将消息广播给所有订阅者。这种通信方式是异步的,即发布者不会等待订阅者处理完消息才继续执行。 3. 灵活性 观察者模式中,目标和观察者之间是紧密耦合的,即目标需要知道它所有的观察者。这种紧密耦合的设计在一定程度上限制了系统的灵活性。 发布-订阅模式中,发布者和订阅者之间是松散耦合的,即发布者不需要知道它的订阅者,订阅者也不需要知道它的发布者。这种松散耦合的设计使得系统更加灵活,可以方便地增加或删除发布者和订阅者。 总之,观察者模式更适合一对多的紧密耦合的场景,而发布-订阅模式更适合一对多的松散耦合的场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值