1 观察者模式定义:
定义对象间的一对多关系。
当一个对象的状态发生改变时,所有依赖于它的对象都能得到通知并被自动更新。
举例:
老板秘书和公司员工的关系就是一种观察者模式。
所有员工先把手机号码发给秘书,在女秘书这里注册,当女秘书收到老板的新通知时,会逐个通知所有员工。
有两个关键点:
女助理是被观察者,所有员工是观察者。
所有员工把手机号发给助理,即注册观察者;
当女秘书接收到老板通知时,她会逐个通知员工,即通知所有观察者。
2 简单示例:
观察者与被观察者基础类
/**目标对象,即被观察者
* @author lincoln
*/
public class Subject {
private List<Observer> list = new ArrayList<Observer>();
public void addObserver(Observer Observer) {
list.add(Observer);
}
public void deleteObserver(Observer Observer) {
list.remove(Observer);
}
public void notifyObserver() {
for (int i = 0; i < list.size(); i++) {
Observer Observer = list.get(i);
Observer.update(this);
}
}
}
/**
* 观察者,接收被观察者发送过来的消息
* @author lincoln
*/
public interface Observer {
public void update(Subject subject);
}
-----------------------------------------------------
具体的被观察者(女秘书)与观察者(员工):
/**
* 女秘书,即具体的被观察者
* @author lincoln
*/
public class NvmishuSubject extends Subject {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
notifyObserver();
}
}
/**普通员工(具体的观察者)
* @author lincoln
*
*/
public class YuangongObserver implements Observer {
private String name;
@Override
public void update(Subject subject) {
System.out.println(name+" "+((NvmishuSubject)subject).getMessage());
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3 模式讲解:
1 目标与观察者之间是一对多的关系。
2 单向依赖:只有观察者依赖于目标(被观察者),目标是不会依赖观察者的。
3 分为推模型和拉模型
推模型包括全部信息
拉模型只包括少量信息,如果观察者需要更多信息,由观察者主动到目标对象中获取。
4 观察者模式的优缺点:
优点:
1 观察者模式实现了观察者和目标之间的抽象耦合。
2 观察者模式实现了动态联动。
3 观察者模式支持广播通信
缺点:
可能会引起无谓的操作。
5 观察者模式的本质:
触发联动。
6 Android中的观察者模式1 ---- view.setOnClickListener(View.OnClickListener l):
View及其子类就是被观察者。
View.OnClickListener就是观察者。
此处观察者和被观察者是一对一的关系。
6 Android中的观察者模式2 ---- ListView