文章目录
1. 定义
观察者模式定义了对象之间的一对多依赖,让多个观察者对象同时监听一个主体对象,当主体对象发生变化时,它的所有依赖者(观察者)都会收到通知并更新
观察者模式有时也叫做发布订阅模式
2. 适用场景
观察者模式只要用于在关联行为之间建立一套触发机制的场景
3. 代码实现
3.1 被观察者类
package com.zhunongyun.toalibaba.designpatterns.observer.jdk;
import lombok.Data;
import java.util.Observable;
@Data
public class Blog extends Observable {
private String name = "问题回答博客";
private static Blog blog = new Blog();
private Blog() {}
public static Blog getInstance() {
return blog;
}
public void publishQuestion (Questtion question) {
System.out.println(question.getUserName() + "在" + this.name + "上提交了一个问题");
super.setChanged();
super.notifyObservers(question);
}
}
package com.zhunongyun.toalibaba.designpatterns.observer.jdk;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class Questtion {
/**
* 提问人
*/
private String userName;
/**
* 问题内容
*/
private String context;
}
3.2 观察者类
package com.zhunongyun.toalibaba.designpatterns.observer.jdk;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.Observable;
import java.util.Observer;
@Data
@AllArgsConstructor
public class Teacher implements Observer {
private String name;
@Override
public void update(Observable o, Object arg) {
Blog blog = (Blog) o;
Questtion questtion = (Questtion) arg;
System.out.println("================================");
System.out.println(name + "老师, 你好! \n" + "你收到一个来着\""
+ blog.getName() + "\"的提问,希望您解答,问题内容如下: \n"
+ questtion.getContext() + "\n" + "提问者:" + questtion.getUserName());
}
}
3.3 测试类
package com.zhunongyun.toalibaba.designpatterns.observer.jdk;
public class JDKObserverTest {
public static void main(String[] args) {
Blog blog = Blog.getInstance();
Teacher teacher1 = new Teacher("李四");
Teacher teacher2 = new Teacher("王五");
Questtion questtion = new Questtion("小明", "观察者模式的原理是什么?");
blog.addObserver(teacher1);
blog.addObserver(teacher2);
blog.publishQuestion(questtion);
}
}
4. 源码解读
4.1 Spring的ContextLoaderListener
public class ContextLoaderListener extends ContextLoader implements ServletContextListener {
}
5. 优缺点
5.1 优点
- 观察者与被观察者之间建立了一个抽象的耦合
- 观察者模式支持广播通信
5.2 缺点
- 观察者之间有过多的细节依赖,提高时间消耗及程序的复杂度
- 使用要得当,要避免循环调用