观察者模式定义
观察者模式定义对象之间的一对多以来,这样以来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
观察者模式理解
结合下面的观察者模式类图。
首先,我们要知道观察者就是那群等待被通知的人,被观察者就是当数据变换要去通知观察的人。
那么被观察者怎么知道要通知哪些人呢?
通过注册的方式,这个时候只要你需要被通知,那么你就要向我注册,那么你想要注册,就要调用被观察者的注册方法,所以观察者要拥有被观察者的对象。
然后由于为了注册方法的复用性强,所以所有的观察者都需要去统一的实现某个接口,这个时候就可以利用多态,被观察者只需要保存一个这个接口的列表即可。
然后如果有数据变化,那么就遍历列表通知所有已经注册的观察者。
松耦合(新的设计原则)
当两个对象之间松耦合时,它们可以交互,但通常对彼此所知甚少。
①首先,主题知道观察者的唯一事情时,它实现了某个接口(观察者接口)。它不需要知道观察者的具体类,它做什么或者关于它的其它事情。
②它可以在任何时候添加新的观察者。因为主题唯一依赖的东西时实现观察者接口的对象列表,我们可以在想要添加的时候,添加新的观察者。事实上,我们可以在运行时替换任意观察者为另一观察者,主题不会收到影响。同样,我们可以在任何时候移除观察者。
③要添加新的类型的观察者,我们绝对不需要修改主题。假如我们有个新的具体类需要当观察者,并不需要对主题的代码做任何修改来兼容新的类型;我们只需要在新类中实现观察者接口并注册为一个观察者。主题不关心这个,它会发通知给所有实现了观察者接口的对象。
④我们可以彼此独立地复用主题或观察者。如果我们在其它地方需要使用主题或观察者。我们可以轻松地服用,因为二者并非紧密耦合。
⑤改变主题或观察者的一方,不会影响另一方。因为二者是松耦合的,所以我们可以自由的改变任何一方,只要对象依然满足约定,实现主题或观察者接口。
观察者模式类图
依据观察者模式类图的代码实现示例
//被观察者
public interface Subject {void registerObserver(Observer o);void removeObserver(Observer o);void notifyAllObserver();
}//被观察对象
public class Observable implements Subject{private List<Observer> observerList;public Observable() {observerList = new ArrayList<>();}@Overridepublic void registerObserver(Observer o) {if (!observerList.contains(o)){observerList.add(o);}}@Overridepublic void removeObserver(Observer o) {if (observerList.contains(o)){observerList.remove(o);}}@Overridepublic void notifyAllObserver() {for (Observer o: observerList) {o.update();}}}//观察者
public interface Observer {void update();}public class Observer1 implements Observer {@Overridepublic void update() {System.out.println("我是Observer1");}}public class Observer2 implements Observer{@Overridepublic void update() {System.out.println("我是Observer2");}}
提醒:如果说,被观察中有一些参数,当这些参数变化时要通知观察者,此时可以考虑让每个具体的观察者对象拿到具体的被观察者对象,然后update中将不更新任何参数,而有观察者通过被观察者对象自由获取。