一, 观察者模式的应用场景
- 当需要观察一个对象在特定的情况下的不同动作的时候使用
- 观察者模式通常是和单例模式一起使用
- 作为一个系统的观察者,来为各个页面发送通知。相当于一个事件的处理器---事件总线
- 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
- 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
二,观察者模式的优缺点
1,优点
- Subject和Observer之间是松偶合的,分别可以各自独立改变。
- Subject在发送广播通知的时候,无须指定具体的Observer,Observer可以自己决定是否要订阅Subject的通知。
- 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。
2,缺点
- 松偶合导致代码关系不明显,有时可能难以理解。(废话)
- 如果一个Subject被大量Observer订阅的话,在广播通知的时候可能会有效率问题。(毕竟只是简单的遍历)
三,观察者实现
事件的响应和处理
public interface MyObserver {
void onUpdate(String tag);
}
四,被观察者实现
事件的触发
public class MyObserveable {
private final ArrayList<MyObserver> arr;
public MyObserveable(){
arr = new ArrayList<>();
}
public void addOberver(MyObserver ob) {
arr.add(ob);
}
public void removeOberver(MyObserver ob) {
arr.remove(ob);
}
public void notifyObserver() {
notifyObserver(null);
}
public void notifyObserver(String tag) {
if(arr == null || arr.size() == 0)return;
while (true) {
Iterator<MyObserver> it = arr.iterator();
if(it.hasNext()) {
MyObserver ob = it.next();
ob.onUpdate(tag);
}
}
}
}
五,被观察者通知观察者
public class MainObserver {
private static final MyObserver mo = new MyObserver() {
@Override
public void onUpdate(String tag) {
System.out.print("收到通知的消息:" + tag);
}
};
public static void main(String[] args) {
MyObserveable moa = new MyObserveable();
moa.addOberver(mo);
moa.notifyObserver("测试观察者");
}
}
网友评论