论坛首页 Java企业应用论坛

复习:观察者模式

浏览 8264 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-10-17   最后修改:2011-10-18

    观察者模式(有时又被称为发布/订阅模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实作事件处理系统。




图1:观察者模式

 

代码实现:

1. Observer接口

public interface Observer {

    void watch(String message);
}

 

2. Subject接口

package cn.lettoo.observe;

public interface Subject {

    void addObserver(Observer observer);

    void deleteObserver(Observer observer);

    void notifyObservers();
}

 

3. Observer实现类A:

package cn.lettoo.observe;

public class ObserverA implements Observer {

    @Override
    public void watch(String message) {
        System.out.println(String.format("This is observer A watching the message: %s", message));
    }
}

 

4. ObserverB,代码略

 

5. SubjectA实现Subject接口:

package cn.lettoo.observe;

import java.util.HashSet;
import java.util.Set;

public class SubjectA implements Subject {

    Set<Observer> observers = new HashSet<Observer>();

    @Override
    public void addObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void deleteObserver(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.watch("MessageA");
        }
    }

}

 

6. 调用代码:

package cn.lettoo.observe;

public class Client {

    public static void main(String[] args) {
        Observer a = new ObserverA();
        Observer b = new ObserverB();

        Subject subject = new SubjectA();
        subject.addObserver(a);
        subject.addObserver(b);

        subject.notifyObservers();
    }
}

 

运行结果
This is observer A watching the message: MessageA
This is observer B watching the message: MessageA
 

 

  • 大小: 9.2 KB
   发表时间:2011-10-17  
3. Observer实现类A:
Java代码  
package cn.lettoo.observe;  
  
public class ObserverA implements Observer {  
  
    @Override  
    public void watch(String message) {  
        System.out.println(String.format("This is observer A watching the message: %s", message));  
    }  
}  

0 请登录后投票
   发表时间:2011-10-18  
sweat89 写道
3. Observer实现类A:
Java代码  
package cn.lettoo.observe;  
  
public class ObserverA implements Observer {  
  
    @Override  
    public void watch(String message) {  
        System.out.println(String.format("This is observer A watching the message: %s", message));  
    }  
}  

谢谢。我已经更正了。

0 请登录后投票
   发表时间:2011-10-18  
lettoo 写道
sweat89 写道
3. Observer实现类A:
Java代码  
package cn.lettoo.observe;  
  
public class ObserverA implements Observer {  
  
    @Override  
    public void watch(String message) {  
        System.out.println(String.format("This is observer A watching the message: %s", message));  
    }  
}  

谢谢。我已经更正了。


        .
0 请登录后投票
   发表时间:2011-10-18  
呵呵,看来最近大家对设计模式都颇感兴趣啊;
PS:java里有现成的实现,可以重用;
0 请登录后投票
   发表时间:2011-10-19  
这个模式在什么样的场景下使用呢?LZ举个例子.
0 请登录后投票
   发表时间:2011-10-19  
阿市A 写道
这个模式在什么样的场景下使用呢?LZ举个例子.


有这样的一个应用:
1. Log File Reader读取Log Text Line,并进行处理成Java Object
2. 把这个Java Object装进一个Subject里
3. 这个Subject配置了两个观察者,一个是用于更新到内部的cache,一个用于写db

如果以后我需要对这个text line有新的操作,我只需要往Subject里增加一个新的Observer实现即可,比如发JMS。
0 请登录后投票
   发表时间:2011-10-19  
阿市A 写道
这个模式在什么样的场景下使用呢?LZ举个例子.

观察者模式注重的是关注对象变化,调用相应的回调函数。
MVC模式的视图使用这样的方式是最合适的。
0 请登录后投票
   发表时间:2011-10-19  
jackra 写道
阿市A 写道
这个模式在什么样的场景下使用呢?LZ举个例子.

观察者模式注重的是关注对象变化,调用相应的回调函数。
MVC模式的视图使用这样的方式是最合适的。

不怎么理解,你说的是视图的跳转控制吗?
0 请登录后投票
   发表时间:2011-10-19   最后修改:2011-10-19
引用

有这样的一个应用:
1. Log File Reader读取Log Text Line,并进行处理成Java Object
2. 把这个Java Object装进一个Subject里
3. 这个Subject配置了两个观察者,一个是用于更新到内部的cache,一个用于写db

如果以后我需要对这个text line有新的操作,我只需要往Subject里增加一个新的Observer实现即可,比如发JMS。

我最近刚学这方面的东西,就代码原理来看可不可以理解成:一个观察者处理一个单独的业务逻辑,例如存储DB,另一个观察者用来写入文件(例如XML文件)。假如有这样的需求,存入DB中得某些数据需要写入xml文件用来向别的接口发送消息。然后将两个观察者放入Subject这个盒子中,利用subject对象去回调每个观察者各自的方法?
我个人认为要是我自己写这样的需求,我将不会用到Subject这个盒子,它除了将观察者封装起来还有其他用途不?我更想了解这个盒子的使用场景。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics