1.定义
定义了对象之间一对多的依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖者(观察者)都会收到通知并更新。举个例子,我在微信朋友圈的某一条动态点赞,那么我就是观察者,动态就是被观察者,当我的好友也评论了该条动态时,微信就会将消息同步给我,而不需要我时刻盯着动态看是否有人评论。
2.优点
观察者和被观察者之间建立一个抽象的耦合,观察者模式支持广播通信。
3.代码示例
public class Course extends Observable {
private String courseName;
public Course(String courseName) {
this.courseName = courseName;
}
public String getCourseName() {
return courseName;
}
/**
*
* @param course 被观察者
* @param question 观察事件
*/
public void produceQuestion(Course course, Question question) {
System.out.println(question.getUserName() + "同学在" + course.courseName + "课程,提了一个问题:" + question.getQuestionContent());
setChanged();
notifyObservers(question);
}
}
public class Teacher implements Observer {
private String teacherName;
public Teacher(String teacherName) {
this.teacherName = teacherName;
}
public String getTeacherName() {
return teacherName;
}
/**
*
* @param o 被观察者
* @param arg 观察事件
*/
@Override
public void update(Observable o, Object arg) {
Course course = (Course) o;
Question question = (Question) arg;
System.out.println(teacherName + "老师在" + course.getCourseName() + "课程,接收到" + question.getUserName() + "同学提出的一个问题:" + question.getQuestionContent());
}
}
public class Question {
//提问者用户名
private String userName;
//问题内容
private String questionContent;
public Question(String userName, String questionContent) {
this.userName = userName;
this.questionContent = questionContent;
}
public String getUserName() {
return userName;
}
public String getQuestionContent() {
return questionContent;
}
}
public class Test {
public static void main(String[] args) {
Course course = new Course("Java");
Teacher teacher = new Teacher("Steven");
Question question = new Question("Sherry", "重载和重写的区别是啥?");
course.produceQuestion(course, question);
teacher.update(course, question);
}
}
Sherry同学在Java课程,提了一个问题:重载和重写的区别是啥?
Steven老师在Java课程,接收到Sherry同学提出的一个问题:重载和重写的区别是啥?