定义
当一个对象的状态发生改变时,所有依赖于他的订阅者都会受到通知,这种就叫做观察者模式
本质
触发联动
优点
如果在不使用观察者模式情况下,如果想实时获取对象的状态并及时做出相应操作,一般会想到去轮循获取这个对象,这种开销极大(主动查询,观察者模式是被动获取)
通过以下案例就能很明确的了解什么是观察者模式了:
首先定义一个目标对象(被观察者)
public class Subject {
private List<Observer> observers = new ArrayList<Observer>();
/**
* 注册观察者
*
* @param observer
*/
public void attach(Observer observer) {
this.observers.add(observer);
}
/**
* 取消注册
*
* @param observer
*/
public void detach(Observer observer) {
this.observers.remove(observer);
}
/**
* 通知所有注册的观察者
*/
protected void notifyObservers() {
for (Observer item : observers) {
item.update(this);
}
}
}
然后定义一个观察者
public interface Observer {
/**
* 更新,当目标对象的状态发生改变时,这个方法会被调用
*
* @param subject
* 目标对象,方便获取相应的目标对象的状态
*
*/
void update(Subject subject);
}
然后定义一个具体的目标对象(具体的被观察者)
public class ConcreateSubject extends Subject {
/**
* 目标对象的状态
*/
private String subjectState;
public String getSubjectState() {
return subjectState;
}
public void setSubjectState(String subjectState) {
this.subjectState = subjectState;
// 目标对象的状态发生改变,通知各个观察者
notifyObservers();
}
}
再定义一个具体的观察者
public class ConcreateObserver implements Observer {
@Override
public void update(Subject subject) {
System.out.println("目标对象的状态发生改变:" + ((ConcreateSubject) subject).getSubjectState());
}
}
最后写一个测试类
public class Client {
public static void main(String[] args) {
// 目标
ConcreateSubject subject = new ConcreateSubject();
// 订阅者
Observer observer1 = new ConcreateObserver();
Observer observer2 = new ConcreateObserver();
// 注册
subject.attach(observer1);
subject.attach(observer2);
// 目标对象发生改变
subject.setSubjectState("启动。。。");
// 取消注册
subject.detach(observer1);
// 再次改变
subject.setSubjectState("再次启动。。。");
}
}
打印日志为
目标对象的状态发生改变:启动。。。
目标对象的状态发生改变:启动。。。
目标对象的状态发生改变:再次启动。。。
网友评论