又称为发布或者订阅模式,定义了一种一对多的依赖关系,让多个观察者同时监听某一个主题对象,当这个主题对象的状态发生变化,会通知观察者,做出更新。
观察者:通常为接口,有一update方法,被观察者发生变化后这个方法会被触发。
被观察者:可以使接口,也可以为抽象类。通常用一个Vector来粗放观察者对象(Vector是线程安全的,List不安全)。attach方法是向这个Vector加对象,detach方法是减对象,notify方法是调用观察者对象的方法。
具体的观察者:具体实现,发生状态变化时需要的处理逻辑。
具体的被观察者:具体的业务逻辑。
abstract class Subject {
private Vector<Observer> obs = new Vector<Observer>();
public void addObserver(Observer obs){
this.obs.add(obs);
}
public void delObserver(Observer obs){
this.obs.remove(obs);
}
protected void notifyObserver(){
for(Observer o: obs){
o.update();
}
}
public abstract void doSomething();
}
class ConcreteSubject extends Subject {
public void doSomething(){
System.out.println("被观察者事件反生");
this.notifyObserver();
}
}
interface Observer {
public void update();
}
class ConcreteObserver1 implements Observer {
public void update() {
System.out.println("观察者1收到信息,并进行处理。");
}
}
class ConcreteObserver2 implements Observer {
public void update() {
System.out.println("观察者2收到信息,并进行处理。");
}
}
public class Client {
public static void main(String[] args){
Subject sub = new ConcreteSubject();
sub.addObserver(new ConcreteObserver1()); //添加观察者1
sub.addObserver(new ConcreteObserver2()); //添加观察者2
sub.doSomething();
}
}
运行结果
被观察者事件反生
观察者1收到信息,并进行处理。
观察者2收到信息,并进行处理。