1.意图
定义对象间的一种一对多的关系,当一个对象的状态发生改变的时候,所有依赖
它的对象都得到通知。
2.参与者
Subject -目标知道它的观察者
-提供注册和删除它的观察者
Observer -为那些在目标中发生改变时需获得通知的对象
ConcreteSubject - 将有关状态存入ConcreteObserver对象
- 当它的状态发生改变的时候,通知它的观察者
ConcreteObserver - 维护一个指向ConcreteSubject对象的引用
- 存储相关的状态,这些状态和目标一致
- 实现Observer的更新接口使它的状态和目标一致
3.结构
4.代码
public interface Subject {
void register(Observer o);
void remove(Observer o);
}
public class ConcreteSubject implements Subject {
private String weather;
private List<Observer> list;
ConcreteSubject(){
list = new ArrayList<Observer>();
}
@Override
public void register(Observer o) {
list.add(o);
}
public void setWeather(String weather) {
this.weather = weather;
for(Observer o:list){
o.changWeather(weather);
}
}
@Override
public void remove(Observer o) {
list.remove(o);
}
}
public interface Observer {
void changWeather(String weather);
}
public class ConcreteObserver implements Observer {
private String weather;
private String name;
@Override
public void changWeather(String weather) {
setWeather(weather);
}
public String getWeather() {
return weather;
}
public void setWeather(String weather) {
this.weather = weather;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Client {
public static void main(String[] args) {
ConcreteSubject weatherT = new ConcreteSubject();
ConcreteObserver o1 = new ConcreteObserver();
o1.setName("天气预报台1");
ConcreteObserver o2 = new ConcreteObserver();
o2.setName("天气预报台2");
ConcreteObserver o3 = new ConcreteObserver();
o3.setName("天气预报台3");
ConcreteObserver o4 = new ConcreteObserver();
o4.setName("天气预报台4");
weatherT.register(o1);
weatherT.register(o2);
weatherT.register(o3);
weatherT.register(o4);
weatherT.setWeather("北京气温零下5度,多晴转云");
System.out.println(o1.getName()+":"+o1.getWeather());
System.out.println(o2.getName()+":"+o2.getWeather());
System.out.println(o3.getName()+":"+o3.getWeather());
System.out.println(o4.getName()+":"+o4.getWeather());
}
}