锁定老帖子 主题:复习:观察者模式
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-10-17
最后修改:2011-10-18
观察者模式(有时又被称为发布/订阅模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实作事件处理系统。
代码实现: 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
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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));
}
}
|
|
返回顶楼 | |
发表时间: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));
}
}
谢谢。我已经更正了。 |
|
返回顶楼 | |
发表时间: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));
}
}
谢谢。我已经更正了。 . |
|
返回顶楼 | |
发表时间:2011-10-18
呵呵,看来最近大家对设计模式都颇感兴趣啊;
PS:java里有现成的实现,可以重用; |
|
返回顶楼 | |
发表时间:2011-10-19
这个模式在什么样的场景下使用呢?LZ举个例子.
|
|
返回顶楼 | |
发表时间: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。 |
|
返回顶楼 | |
发表时间:2011-10-19
阿市A 写道 这个模式在什么样的场景下使用呢?LZ举个例子.
观察者模式注重的是关注对象变化,调用相应的回调函数。 MVC模式的视图使用这样的方式是最合适的。 |
|
返回顶楼 | |
发表时间:2011-10-19
jackra 写道 阿市A 写道 这个模式在什么样的场景下使用呢?LZ举个例子.
观察者模式注重的是关注对象变化,调用相应的回调函数。 MVC模式的视图使用这样的方式是最合适的。 不怎么理解,你说的是视图的跳转控制吗? |
|
返回顶楼 | |
发表时间: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这个盒子,它除了将观察者封装起来还有其他用途不?我更想了解这个盒子的使用场景。 |
|
返回顶楼 | |