目录
一、观察者模式的定义与类型
- 一、观察者模式的定义与类型
- 二、观察者模式的适用场景
- 三、观察者模式的优点
- 四、观察者模式的缺点
- 五、观察者模式示例
1、定义
- 定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖者(观察者)都会受到通知并更新
2、类型
- 行为型
- 关联行为场景,建立一套触发机制
- 观察者和被观察者之间建立一个抽象的耦合
- 观察者模式支持广播通信
- 观察者之间有过多的细节依赖,提高时间消耗及程序复杂度
- 使用要得当,要避免循环调用
以线上课程提问,教师接收问题为例进行代码演示
1、代码结构如下:
2、定义一个课程类,继承 Observable 类,说明该类为被观察者
package com.rf.designPatterns.behavioral.observer;
import java.util.Observable;
/**
* @description: 定义一个课程类
* 该类继承 Observable 类,说明该类为被观察者
* @author: xz
*/
public class Course extends Observable {
private String courseName;//课程名称
//构造器
public Course(String courseName) {
this.courseName = courseName;
}
// getter、setter方法
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
//生产问题方法
public void productQuestion(Course course,Question question){
System.out.println("("+question.getUserName()+") 在 【"+course.courseName+"】 中提交了一个问题");
//继承的Observable类所提供的方法,表示状态发生改变
setChanged();
//继承的Observable类所提供的方法,表示通知观察者
//把具体的提问内容当参数
notifyObservers(question);
}
}
3、 定义一个提问题的类
package com.rf.designPatterns.behavioral.observer;
/**
* @description: 定义一个提问题的类
* @author: xz
*/
public class Question {
private String userName;//提问者
private String questionContent;//提问的内容
// getter、setter方法
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;
}
}
4、 定义一个讲师类,实现 Observer 接口,表示该类为观察者
package com.rf.designPatterns.behavioral.observer;
import java.util.Observable;
import java.util.Observer;
/**
* @description: 定义一个讲师类
* 实现 Observer 接口,表示该类为观察者
* @author: xz
*/
public class Teacher implements Observer {
private String teacherName;//讲师名称
//构造方法
public Teacher(String teacherName) {
this.teacherName = teacherName;
}
/**
* @param o 表示被观察的对象,该示例中课程类为被观察的对象
* @param arg 通过 notifyObservers方法 传递的参数
*/
@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());
}
}
5、观察者模式的测试类
package com.rf.designPatterns.behavioral.observer;
/**
* @description: 观察者模式的测试类
* @author: xz
*/
public class Test {
public static void main(String[] args) {
//创建课程
Course course = new Course("java设计模式之观察者模式");
//创建讲师
Teacher teacher = new Teacher("xz");
//课程中添加观察者
course.addObserver(teacher);
//创建问题
Question question = new Question();
question.setUserName("张三");
question.setQuestionContent("观察者模式如何学习");
//生产问题
course.productQuestion(course,question);
}
}
6、运行测试类,输入如下: 7、UML类图如下: