1.定义
观察者模式定义了一种一堆多的依赖关系,当一个对象的状态发生改变时,所有依赖于它对象都会得到通知。观察者模式也被成为发布-订阅模式。实现了解耦,在需要新增一个观察者的时候只需要new一个出来,然后注册到主题对象就可以了,在观察者不需要观察该主题对象,只需要在主题对象的观察者列表中去除该观察者对象即可。
2.结构图
Subject
: 被观察者的对象抽象类。其中包含了观察者的集合,添加和删除观察者的方法。还有通知观察者观察对象已改变的方法
Observer
:抽象观察者类。只有一个响应接口,响应接口中定义了被观察者。响应接口除了需要做出需要做的事情之外,还需要将自己注册到被观察者中去。
3.实例
被观察者的对象抽象类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
public abstract class Subject {
List<Observer> observerList = new ArrayList<>();
public void addObserver(Observer observer) { observerList.add(observer); }
public void deleteObserver(Observer observer) { observerList.remove(observer); }
public abstract void signature();
public void report() { for(Observer observer : observerList) { observer.response(this); } } }
|
观察者抽象类
1 2 3 4
| public interface Observer { public void response(Subject subject); }
|
具体被观察者类
1 2 3 4 5 6 7
| public class Student extends Subject { @Override public void signature() { System.out.println("我要吃饭呜呜呜"); report(); } }
|
具体观察者类
1 2 3 4 5 6 7
| public class Teacher implements Observer { @Override public void response(Subject subject) { subject.addObserver(this); System.out.println("老师说:好好学习,以后每顿都能吃上两个肉"); } }
|