1 概念
1 定义
定义了对象之间的一对多依赖。让多个观察者同时监听一个主题对象,当主题对象发生变化时,它的观察者都会收到通知并更新。
类型:行为型
2 应用场景
关联行为场景。建立一套触发机制
3 优缺点
优点:
缺点:
- 观察者之间有过多依赖的话,会提高程序复杂度
- 使用需要注意,避免观察者和被观察者循环调用
2 代码实现
场景:同学在网站上提出问题,老师收到通知
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
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.courseName+"提交了一个问题"); setChanged(); notifyObservers(question); } }
|
1 2 3 4 5 6
| @Getter @Setter public class Question { private String userName; private String questionContent; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
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(teacherName+"老师的"+course.getCourseName()+"课程接收到一个"+question.getUserName()+"提交的问答:"+question.getQuestionContent()); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public class Test { public static void main(String[] args) { Course course = new Course("Java设计模式精讲"); Teacher teacher1 = new Teacher("Alpha"); Teacher teacher2 = new Teacher("Beta"); course.addObserver(teacher1); course.addObserver(teacher2);
Question question = new Question(); question.setUserName("Geely"); question.setQuestionContent("Java的主函数如何编写");
course.produceQuestion(course,question);
} }
|
输出:
Geely在Java设计模式精讲提交了一个问题
Beta老师的Java设计模式精讲课程接收到一个Geely提交的问答:Java的主函数如何编写
Alpha老师的Java设计模式精讲课程接收到一个Geely提交的问答:Java的主函数如何编写