快速导航
一、观察者模式介绍
二、代码演示
三、jdk中使用观察者模式的地方
一、 观察者模式介绍
定义:定义了对象之间一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖者(观察者)都会收到通知并更新。
类型:
行为型
适用场景:
关联行为场景,建立一套触发机制
优点:
观察者和被观察者之间建立一个抽象的耦合
观察者模式支持广播通信
缺点:
观察者之间有过多的细节依赖,提高时间消耗及程序复杂度
使用要得当,避免循环调用
二、代码演示
/**
* @program: adpn-pattern->Course
* @description: 课程类
* @author: Jstar
* @create: 2019-12-01 16:01
**/
public class Course extends Observable {
private String courseName;
public Course(String courseName) {
this.courseName = courseName;
}
public String getCourseName() {
return courseName;
}
public void produceQuestion(Course course,Question question){
System.out.println(question.getUsername()+"在"+course.getCourseName()+"提了问题");
setChanged();
notifyObservers(question);
}
}
/**
* @program: adpn-pattern->Question
* @description: 问题类
* @author: Jstar
* @create: 2019-12-01 16:02
**/
public class Question {
private String username;
private String questionContent;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getQuestionContent() {
return questionContent;
}
public void setQuestionContent(String questionContent) {
this.questionContent = questionContent;
}
}
/**
* @program: adpn-pattern->Teacher
* @description: 讲师类
* @author: Jstar
* @create: 2019-12-01 16:03
**/
public class Teacher implements Observer {
private String teacherName;
public Teacher(String teacherName) {
this.teacherName = teacherName;
}
@Override
public void update(Observable o, Object arg) {
Course course= (Course) o;
Question question= (Question) arg;
System.out.println(this.teacherName+"老师的"+course.getCourseName()+"课程,接收到:"+question.getUsername()+"学生提的一个问题:"+question.getQuestionContent());
}
}
//测试类
public class Test{
public static void main(String[] args) {
Course course = new Course("设计模式");
Teacher teacher = new Teacher("李雷");
course.addObserver(teacher);
Question question = new Question();
question.setUsername("张三三");
question.setQuestionContent("如何学好设计模式");
Question question2 = new Question();
question2.setUsername("李四四");
question2.setQuestionContent("设计模式是什么");
course.produceQuestion(course,question);
course.produceQuestion(course,question2);
}
}
来看一下类的uml图:
运行结果:
学生张三三和李四四提的问题,已经被讲师监听到了。达到了观察者模式效果。
三、jdk中使用观察者模式的地方
1、java.awt.Event
2、监听器 java.util.EventListener
3、com.google.common.eventbus.Subscribe
使用@Subscribe ,即实现
/**
* @program: adpn-pattern->SubEvent
* @description: 订阅类
* @author: Jstar
* @create: 2019-12-01 16:34
**/
public class SubEvent {
@Subscribe
public void testSub(String content){
System.out.println("Subscribe 接收到的内容是:"+content);
}
}
//测试类
public class SubTest {
public static void main(String[] args) {
EventBus eventBus = new EventBus();
SubEvent subEvent = new SubEvent();
eventBus.register(subEvent);
eventBus.post("发一条消息");
}
}
执行结果: