描述:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新
角色:
Observer :所有观察者接口
ConcreteObserver:具体观察的对象
Subject:主题,每个主题都可以有任何数量的观察者,提供删除和增加观察者的接口
ConcerteSubject:实现增加和删除观察者,实现通知所有观察者对象
//主题
public abstract class Subject {
//观察者列表
private List<Observer> list = new ArrayList<Observer>();
//增加观察者
public void attach(Observer observer){
list.add(observer);
}
// 删除观察者对象
public void detach(Observer observer){
list.remove(observer);
}
// 通知所有注册的观察者对象
public void nodifyObservers(){
for(Observer observer : list){
observer.update();
}
}
}
//具体主题
public class ConcreteSubject extends Subject{
private String state;
public String getState() {
return state;
}
public void change(String newState){
state = newState;
System.out.println("主题状态为:" + state);
//状态发生改变,通知各个观察者
this.nodifyObservers();
}
}
//观察者接口
public interface Observer {
public void update();
}
//具体观察者
public class ConcreteObserver implements Observer {
//观察者的状态
private String observerState;
ConcreteSubject subject;
@Override
public void update() {
//更新观察者的状态,使其与目标的状态保持一致
observerState = subject.getState();
System.out.println("状态为:"+observerState);
}
public ConcreteObserver(ConcreteSubject subject) {
super();
this.subject = subject;
}
}
public class Client {
public static void main(String[] args) {
//创建主题对象
ConcreteSubject subject = new ConcreteSubject();
//创建观察者对象
Observer observer = new ConcreteObserver(subject);
//将观察者对象登记到主题对象上
subject.attach(observer);
//改变主题对象的状态,底下所有观察者的状态也改变
subject.change("new state");
}
}