观察者模式也叫发布订阅模式,意思是:定义对象之间一对多的依赖关系,使得每当一个对象改变状态时,则所有依赖于它的对象都得到通知并被自动更新。
观察者模式(发布订阅模式)包含如下角色:
- 抽象发布者:可以增加、删除、通知订阅者;
- 具体发布者:抽象发布者方法的具体实现;
- 抽象订阅者:定义一个接受通知的方法,在得到通知时更新自己的状态;
- 具体订阅者:抽象订阅者的具体实现。
下面以订阅报纸为例:
public interface INewsPaper {
//添加订阅者
void add(IPerson iPerson);
//删除订阅者
void remove(IPerson iPerson);
//通知所有订阅者
void notifyPersons();
}
public class NewsPaper implements INewsPaper {
private List<IPerson> personList = new ArrayList<>();
@Override
public void add(IPerson iPerson) {
personList.add(iPerson);
}
@Override
public void remove(IPerson iPerson) {
personList.remove(iPerson);
}
@Override
public void notifyPersons() {
for (IPerson person: personList) {
person.update();
}
}
}
public interface IPerson {
void update();
}
public class Person implements IPerson {
@Override
public void update() {
System.out.println("我收到了通知");
}
}
public class Test {
public static void main(String[] args) {
INewsPaper newsPaper = new NewsPaper();
IPerson person = new Person();
newsPaper.add(person);
newsPaper.notifyPersons();
}
}
我收到了通知
由上述代码可知,在观察者模式中,发布者并不知道每一个订阅者,它只知道订阅者们的共同接口-抽象订阅者,所以观察者模式容易扩展,符合开闭原则。但是,如果订阅者比较多时,每个通知会比较耗时。
观察者模式的应用场景如下:
- 关联行为的场景,比如:在一个系统中,如果用户完善了个人资料,就会增加积分、开放更多权限等;
- 消息队列