[TOC]
一下文字来源:秦小波 《设计模式之禅》,这本设计模式书是太经典。
原理
相当于把观察者写入到了被观察者的那个类中。 然后在被观察者类里面调用观察者的接口就好了。
Subject被观察者
定义被观察者必须实现的职责,它必须能够动态地增加、取消观察者。它一般是抽象类 或者是实现类,仅仅完成作为被观察者必须实现的职责:管理观察者并通知观察者。
Observer观察者
观察者接收到消息后,即进行update(更新方法)操作,对接收到的信息进行处理。
ConcreteSubject具体的被观察者
定义被观察者自己的业务逻辑,同时定义对哪些事件进行通知。
ConcreteObserver具体的观察者
每个观察在接收到消息后的处理反应是不同,各个观察者有自己的处理逻辑。
观察者模式通用模式
被观察者
import java.util.Vector;
/**
* 被观察者的职责非常简单,就是定义谁能够观察,谁不能观察
*/
public abstract class Subject {
private Vector<Observer> observers = new Vector<Observer>();
/**
* 添加一个观察者
* @param o
*/
public void addObserver(Observer o) {
observers.add(o);
}
/**
* 删除一个观察者
* @param o
*/
public void delObserver(Observer o) {
observers.remove(o);
}
/**
* 通知所有观察者
*/
public void notifyObservers() {
for (Observer o : this.observers) {
o.updateMessage();
}
}
}
具体被观察者
public class ConcreteSubject extends Subject{
public void doSomeThing() {
System.out.println("被观察者:处理自己特有的业务");
super.notifyObservers();
}
}
观察者
public interface Observer {
public void updateMessage();
}
具体观察者
public class ConcreteObserver implements Observer {
@Override
public void updateMessage() {
System.out.println("观察者:接受消息,并进行处理");
}
}
测试代码
public class Client {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
ConcreteObserver observer = new ConcreteObserver();
subject.addObserver(observer);
subject.doSomeThing();
}
}
运行结果
被观察者:处理自己特有的业务
观察者:接受消息,并进行处理
注意
其中如果多个观察者在处理各自业务的时候,出现了阻塞的话,或者其中一个出现了错误,怎么办? 对于这种我们一般采用异步处理各自的业务代码,或者提前做好缓存的处理,防止消息链条的问题。
也可以理解这是一种 事件驱动模型
「真诚赞赏,手留余香」