观察者模式定义了对象之间的一对多的依赖,当一个对象改变状态时,他的所有依赖者都会收到通知并且自动更新。
观察者提供了一种对象设计,让观察者和主题之间的松耦合。、
设计原则:
1.为了对象之间的松耦合设计而努力。
步骤:
1.目标对象的定义
2.具体目标对象的定义
3.观察者接口的定义
4.观察者接口的具体实现
一种观察者模式实现的通用框架
package observer;
import java.util.ArrayList;
/**
* 目标对象
*/
public class Subject {
//保存注册的观察者对象
private ArrayList<Observer> observers = new ArrayList<Observer>();
public void registerObserver(Observer o) {
observers.add(o);
}
public void removeObserver(Observer o) {
observers.remove(o);
}
//通知注册的观察者
protected void notifyObserver() {
for (Observer observer : observers) {
observer.update(this);
}
}
}
package observer;
public class ConcreateSubject extends Subject{
private String subjectState;
public String getSubjectState() {
return subjectState;
}
public void setSubjectState(String subjectState) {
this.subjectState = subjectState;
this.notifyObserver();
}
}
package observer;
/**
* 所有的观察者都实现这个接口。主题在通知观察者时,就有了一个共同的接口
*/
public interface Observer {
public void update(Subject subject);
}
package observer;
public class ConcreateObserver implements Observer{
private String observerState;
/**
* 获取目标的状态同步到观察者状态
* */
@Override
public void update(Subject subject) {
observerState = ((ConcreateSubject)subject).getSubjectState();
System.out.println(this.toString());
}
@Override
public String toString() {
return "ConcreateObserver [observerState收到" + observerState + "]";
}
}
测试代码及结果
package observer;
public class test {
public static void main(String[] args) {
ConcreateSubject concreateSubject = new ConcreateSubject();
Observer observer = new ConcreateObserver();
concreateSubject.registerObserver(observer);
concreateSubject.setSubjectState("1");
concreateSubject.setSubjectState("3");
}
}
ConcreateObserver [observerState收到1]
ConcreateObserver [observerState收到3]