1、定义:定义了对象间的一对多依赖,当一个对象改变时,他所有的依赖着都会收到通知并自动更新
解析:主题Subject 是一个有状态的对象,也是真正拥有数据得人,当Subject改变时,依赖他的人就会就会收到通知
类似于报纸的订阅,报社是主题对象,是一个被依赖的人,订阅者在报社订阅报纸之后,只要是报纸有新消息都会通知
订阅者,当订阅者不想被通知时,只要跟报社说一声不要在通知我了即可,以此带入我们便得到基本的观察者模式代码
/**
* 主题接口 对象使 用此接口注册为观察者
* 1、主题对象必然有增加观察者的方法,即报社中增加订阅者的方法 register,传入订阅者
* 2、有增加必然有删除,订阅者不想再收到报纸,就将他移除 remove,传入订阅者
* 3、通知方法 报社的报纸方法方法 notify()用来通知观察者
* @author xiaohan
*
*/
public interface Subject {
//这两个方法需要observer,用来删除或者注册
public void registerObserver(Observer o);
public void removeObserver(Observer o);
//主题状态改变时,这个方法被调用,通知所有观察者
public void notifyObserver();
}
/**
* 具体的主题对象,实现主题接口
* @author xiaohan
*
*/
public class WeatherDate implements Subject {
//关键:用于放观察者的容器
private List<Observer> 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(o);
}
}
@Override
public void notifyObserver() {
for (int i = 0; i < observers.size(); i++) {
Observer observer = (Observer) observers.get(i);
observer.update();
}
}
//当从气象站得到更新数据时,通知观察者
public void measrementChange(){
notifyObserver();
}
}
/**
* 在主题接口中我们传入了obsever 根据设计原则,针对接口编程,该接口仅有一个更新方法
* 观察者接口 所有潜在的观察者必须实现该接口,实现解耦
*/
public interface Observer {
//主题状态改变时会把这些值当做方法参数,传递给观察者
public void update();
}
/**
* 具体观察者,实现观察者接口
*/
public class Observer1 implements Observer{
@Override
public void update() {
System.out.println("通知观察者一号");
}
}
public class ObserverTest {
public static void main(String[] args) {
WeatherDate w = new WeatherDate();
//注册观察者
w.registerObserver(new Observer1());
w.measrementChange();
}
}