声明:
本博客是本人在学习《Java 设计模式精讲》后整理的笔记,旨在方便复习和回顾,并非用作商业用途。
本博客已标明出处,如有侵权请告知,马上删除。
1. 观察者模式讲解
- 定义:定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖者(观察者)都会收到通知并更新
- 类型:行为型
- 适用场景
- 关联行为场景,建立一套触发机制
- 优点
- 观察者和被观察者之间建立一个抽象的耦合
- 观察者模式支持广播通信
- 缺点
- 观察者之间有过多的细节依赖、提高时间消耗及程序复杂度
- 使用要得当,要避免循环调用
2. 观察者模式 Coding
下面我们实现一个业务场景,老师观察课程中提出的问题。
-
创建问题类
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; } }
-
创建被观察者课程类
public class Course extends Observable { private String courseName; public Course(String courseName) { this.courseName = courseName; } public String getCourseName() { return courseName; } public void produceQuestion(Question question) { System.out.println(question.getUserName() + "在" + this.getCourseName() + "提交了一个问题 "); setChanged(); notifyObservers(question); } }
-
创建观察者老师类
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()); } }
-
测试类
public class Test { public static void main(String[] args) { Course course = new Course("Java设计模式精讲"); Teacher teacher = new Teacher("Alpha"); course.addObserver(teacher); //业务逻辑代码 Question question = new Question(); question.setUserName("张三"); question.setQuestionContent("Java的主函数如何编写"); course.produceQuestion(question); } }
运行结果:
张三在Java设计模式精讲提交了一个问题 Alpha老师的Java设计模式精讲课程接收到一个张三同学提交的问答:Java的主函数如何编写
-
现在我们再添加一个 Beta 老师作为观察者
public class Test { public static void main(String[] args) { Course course = new Course("Java设计模式精讲"); Teacher teacher = new Teacher("Alpha"); Teacher teacher2 = new Teacher("Beta"); course.addObserver(teacher); course.addObserver(teacher2); //业务逻辑代码 Question question = new Question(); question.setUserName("张三"); question.setQuestionContent("Java的主函数如何编写"); course.produceQuestion(question); } }
运行结果:
张三在Java设计模式精讲提交了一个问题 Beta老师的Java设计模式精讲课程接收到一个张三同学提交的问答:Java的主函数如何编写 Alpha老师的Java设计模式精讲课程接收到一个张三同学提交的问答:Java的主函数如何编写
分析:这样就实现了当一个被观察者的状态发生改变时,所有被观察者都得到通知并被自动更新。
现在类图如下所示: