1、定义
观察者模式定义了对象之间的一对多的依赖关系,这样一来,当一个对象的状态发生变化时,它的所有依赖者都会收到通知并自动更新。
2、特点
由抽象主题(Subject)角色(提供一个接口可以加上或撤销观察者对象)、抽象观察者(Observer)角色(为所有的具体观察者定义一个接口,在得到通知时更新自己)、 具体主题角色(保存对具体观察者对象有用的内部状态;在这种内部状态改变时给其观察者发出一个通知;具体主题角色又叫作具体被观察者角色)、具体观察者角色(保存一个指向具体主题对象的引用;和一个与主题的状态相符的状态。具体观察者角色实现抽象观察者角色所要求的更新自己的接口,以便使本身的状态与主题的状态匹配)。
3、UML类图
4、Demo
import java.util.ArrayList;
interface Observer{
public void update(String message);
}
class ConcreteObserver implements Observer {
public ConcreteObserver(Subject subject) {
subject.registerObserver(this);
}
@Override
public void update(String message) {
System.out.println(message);
}
}
interface Subject{
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers();
}
class ConcreteSubject implements Subject{
private ArrayList<Observer> observers;
private String message;
public ConcreteSubject() {
observers = new ArrayList<Observer>();
}
@Override
public void registerObserver(Observer o) {
observers.add(o);
}
@Override
public void removeObserver(Observer o) {
int i = observers.indexOf(o);
if (i > 0){
observers.remove(i);
}
}
@Override
public void notifyObservers() {
for (int i = 0; i < observers.size(); i ++){
Observer observer = observers.get(i);
observer.update(message);
}
}
public void setMessage(String message){
this.message = message;
notifyObservers();
}
}
public class ObserverGenerater{
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
ConcreteObserver concreteObserver= new ConcreteObserver(subject);
subject.setMessage("Hello World");
subject.setMessage("test");
}
}
5、Java的观察者模式实现