定义:
定义对象之间的一种一对多的依赖关系,使得每当一个对象状态发生改变的时其相关依赖对象皆得到通知并被自动更新
观察者模式别名有:发布-订阅模式、模型-视图模式、源-监听模式、从属者模式
结构:
通常包括观察目标和观察者两个继承层次结构
Subject(目标类):被观察的对象
ConcreteSubject(具体目标):目标类的子类
Observer(观察者):对观察目标的改变做出反应
ConcreteObserver(具体观察者):观察者的子类
实现:
public interface Observer {
public void notifyed();
}
//具体观察者类
public class ConcreteObserver implements Observer{
@Override
public void notifyed() {
System.out.println("收到通知");
}
}
public abstract class Subject {
public ArrayList<Observer> observer = new ArrayList<Observer>();
public void attach(Observer observers) {
observer.add(observers);
}
public void detach(Observer observers) {
observer.remove(observers);
}
public abstract void notifyed();
}
//具体目标类
public class ConcreteSubject extends Subject{
@Override
public void notifyed() {
for(Observer observers : observer) {
observers.notifyed();
}
}
}
public class Client {
public static void main(String[] args) {
Subject subject = new ConcreteSubject();
Observer observer1 = new ConcreteObserver();
Observer observer2 = new ConcreteObserver();
subject.attach(observer1);
subject.attach(observer2);
subject.notifyed();
int [][] a= new int[1][1];
a[0][0]=1;
for(int []b : a) {
for(int c:b) {
System.out.println(c);
}
}
}
}
优点:
-
可以实现表示层和数据逻辑层分离
-
在观察目标和观察者之间建立一个抽象的耦合
-
支持广播通信
-
符合开闭原则
缺点:
- 如果一个观察目标对象有很多直接和间接观察者,将所有的观察者都通知到会花费很多时间
- 如果在观察者和观察目标之间存在循环依赖,观察目标会触发他们之间进行循环调用,可能导致系统奔溃
- 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化