您的位置:首页 > 其它

设计模式之观察者模式

2016-03-28 20:11 155 查看
观察者模式也叫发布订阅模式,其定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。

通用UML类图:



- Subject被观察者,定义被观察者必须实现的职责,它必须能够动态地增加、取消观察者。

- Observer观察者,观察者接收到消息后,即进行update(更新方法)操作,对接收到的信息进行处理。

- ConcreateSubject具体的被观察者,定义被观察者自己的业务逻辑,同时定义对哪些时间进行通知。

- ConcreateObserver具体的观察者,每个观察在接收到消息后的处理是不同的,各个观察者有自己的处理逻辑

通用代码:

public class Subject {

private Vector<Observer> list = new Vector<Observer>();
public void addObserver(Observer o){
this.list.add(o);
}
public void removeObserver(Observer o){
this.list.remove(o);
}
public void notifyObservers(){
for(Observer o : this.list){
o.update();
}
}
}
public class ConcreateSubject extends Subject{
public void doSomething(){
//具体的业务操作
super.notifyObservers();
}
}
public interface Observer {

public void update();
}
public class ConcreateObserver implements Observer{

@Override
public void update() {
//实行更新方法
}
}
public class Client {
public static void main(String[] args) {
//创建一个被观察者
ConcreateSubject subject = new ConcreateSubject();
//定义一个观察者
Observer observer = new ConcreateObserver();
//注册观察者
subject.addObserver(observer);
//被观察者开始活动
subject.doSomething();
}
}


使用场景:

- 关联行为场景。需要注意的是,关联行为是可拆分的,而不是组合关系。

- 事件多级触发场景。

- 跨系统的消息交换场景,如消息队列的处理机制。

注意事项:

其实java已经为我们提供了oberverable和oberver这个观察者框架,所以平常如果要用观察者模式的话,直接继承和实现就可以了,不用自己再重复写。

观察者模式在实际项目中的应用:

- 观察者和被观察者之间的消息沟通,一般情况下,观察中中的update方法接收两个参数,一个是被观察者,一个是DTO(传输对象),DTO一般是一个纯洁的javaBean,由被观察者生成,观察者消费。如果考虑到远程传输,一般消息是以XML格式传递。

- 观察者的响应方式,要使观察者能快速响应,有两个方法:一是采用多线程技术,即异步架构;而是缓存技术,即我缓存了几乎所有的可能性结果,你来请求就能马上从缓存中返回给你,这个即是同步架构。

- 被观察者尽量自己做主,意思是当被观察者状态变更时,不一定一定要通知所有的观察者,可以判断一下是否有必要通知。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: