观察者模式
1.定义与类型
- 定义:定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖着都会收到通知并更新。
- 类型:行为型
2.适用场景
- 关联行为场景,建立一套触发机制
3.优点
- 观察者和被观察者之间建立一个抽象的耦合
- 观察者模式支持广播通信
4.缺点
- 观察者之间有过多的细节依赖,提高时间消耗及程序复杂度
- 使用要得当,避免循环调用
5.Coding
- 创建问题类
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.getStudentName()+"提出的问题:"+question.getQuestionContent());
}
}
创建课程类
- 继承Observable类,表示是一个被观察者
- 可以重写其中的方法,setChange()标识告诉观察者有改变;notifyObservers()通知观察者
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.getStudentName()+"在"+course.getCourseName()+"课程中,提出了问题:"+question.getQuestionContent());
setChanged();
notifyObservers(question);
}
}
创建教师类
- 实现Observer接口,表示是一个观察者
- 重写update方法,可以根据被观察者传递的参数进行业务逻辑编写
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.getStudentName()+"提出的问题:"+question.getQuestionContent());
}
}
- Test类
public class Test {
public static void main(String[] args) {
// 创建被观察者
Course course = new Course("如何让富婆爱上我~");
// 创建观察者
Teacher teacher = new Teacher("HHHH");
// 绑定观察者和被观察者
course.addObserver(teacher);
Question question = new Question();
question.setStudentName("Root");
question.setQuestionContent("有富婆的联系方式 吗?");
course.produceQuestion(course,question);
}
}
- 控制台输出
6.总结
- 两个结构:观察者和被观察者
- 被观察者发生改变时,可以通知观察者
- 观察者可以接受被观察者发生改变传入的参数,进行编码
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。