一、概念
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
二、UML类图
三、基本代码实现
1、Subject类
public abstract class Subject {
private Listobservers = new ArrayList ();
public void attach(Observer observer){
observers.add(observer);
}
public void detach(Observer observer){
observers.remove(observer);
}
public void inform(){
for(Observer observer :observers ){
observer.update();
}
}
}
2、ConcreteSubject,保存状态信息,在状态发生变化时,给所有登记过的观察者发出通知
public class ConcreteSubject extends Subject {
private String subjectState;
public String getSubjectState() {
return subjectState;
}
public void setSubjectState(String subjectState) {
this.subjectState = subjectState;
}
}
3、Observer,抽象观察者
public abstract class Observer {
public abstract void update();
}
4、ConcreteObserver,具体观察者
public class ConcreteObserver extends Observer{
private String name ;
private String oberserState;
private ConcreteSubject subject;
public ConcreteObserver(ConcreteSubject subject , String name){
this.subject = subject;
this.name = name ;
}
@Override
public void update() {
this.oberserState = subject.getSubjectState();
System.out.println("观察者的新状态是" + name + oberserState);
}
}
5、测试类
public class Main {
public static void main(String[] args) {
ConcreteSubject s = new ConcreteSubject();
s.attach(new ConcreteObserver(s , "观察者1"));
s.attach(new ConcreteObserver(s , "观察者2"));
s.attach(new ConcreteObserver(s , "观察者3"));
s.setSubjectState("111111");
}
}
四、总结
将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维护一致性而使各类紧密耦合,这样会给维护、扩展和重用带来不方便。而观察者模式的关键对象是主题和观察者,一个主题可以有任意数量的依赖他的观察者,一旦主题状态发生改变,所有的观察者都可以得到通知。主题对象发出通知时,不需要知道谁是它的观察者,也就是说,具体观察者是谁,它根本不需要知道。而任何一个具体观察者也不需要知道其他观察者的存在。
也就是说当一个对象的改变需要同时改变其他对象,而且它不知道具体有多少对象需要改变时,应该考虑观察者模式。