基础与定义
- 定义来对象之间的一对多依赖,让多个观察者对象同时监听某一个主题,当主题对象发生变化时,它的所有依赖者(观察者)都会收到通知并更新
比如:淘宝你关注来一个商品的降价提醒,它降价来就会通知你
JDK对此模式的支持
- Observable 被观察对象继承它
源码实例
- listener
- java.awt 或 java.swing 里面的 event
代码实例
学生给老师的课程提问题,老师是观察这,课程是被观察者
// 实现 Observable
public class Course extends Observable {
private String courseName;
public Course(String courseName) {
this.courseName = courseName;
}
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public void produceQuestion(Course course,Question question){
System.out.println(question.getUserName()+"" +
"在"+course.getCourseName()+"提出问题");
setChanged();
// 传入参数
notifyObservers(question);
}
}
// 问题
@Data
public class Question {
private String userName;
private String wenti;
}
// 教师类 实现 Oberver
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.getWenti());
}
}
// 使用
public class Test {
public static void main(String[] args){
Course course =
new Course("JAVA 设计模式精讲");
Teacher teacher = new Teacher("王二娃");
Teacher teacher1 = new Teacher("王大娃");
course.addObserver(teacher);
course.addObserver(teacher1);
// 业务逻辑代码
Question question = new Question();
question.setUserName("二狗子");
question.setWenti("1 + 1 = ?");
course.produceQuestion(course,question);
}
}