目录
1.观察者模式
定义:
使用场景:
优点:
缺点:
现在的业务场景是这样的:一个学生在线上学完课程后给课程的老师提了一个问题,那么老师需要接收到那个学生就哪个课程提了什么问题。观察者肯定就是老师,被观察者是课程,而不是问题。
2. UML类图
编写一个观察者,老师是观察者,被观察者的状态发生改变以后需要通知观察者。update()方法就是被观察者改变状态后,观察者执行的方法,这个方法还可以接收被观察者传过来的参数。
package com.wx.design_pattern.observer;
import java.util.Observable;
import java.util.Observer;
/**
* User: Mr.Wang
* Date: 2019/12/19
*/
public class TeacherObserver implements Observer {
private String name;
public TeacherObserver(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
CourseObservable courseObservable = (CourseObservable) o;
Question question = (Question) arg;
System.out.println(name + "的课程:" + courseObservable.getCourseName()
+ "收到" + question.getUsreName() + "提出的问题:" + question.getQuestName());
}
}
课程作为被观察者,他需要做的事情就是改变状态,通知所有的观察者。
package com.wx.design_pattern.observer;
import java.util.Observable;
/**
* User: Mr.Wang
* Date: 2019/12/19
*/
public class CourseObservable extends Observable {
private String courseName;
public CourseObservable(String courseName) {
this.courseName = courseName;
}
/***
* 问题提出以后被观察者状态就要发生改变,并且通知所有的观察者对象
* 并且具体要通知什么消息,可以传也可以不传
* @param question
* @param course
*/
public void productQuestion(Question question, CourseObservable course) {
System.out.println(question.getUsreName() + "在" + course.getCourseName()
+ "提了一个问题:" + question.getQuestName());
setChanged();
notifyObservers(question);
}
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
}
一个课程的实体EventPayload
package com.wx.design_pattern.observer;
/**
* User: Mr.Wang
* Date: 2019/12/19
*/
public class Question {
private String questName;
private String usreName;
public String getUsreName() {
return usreName;
}
public void setUsreName(String usreName) {
this.usreName = usreName;
}
public String getQuestName() {
return questName;
}
public void setQuestName(String questName) {
this.questName = questName;
}
}
客户端测试:
package com.wx.design_pattern.observer;
/**
* User: Mr.Wang
* Date: 2019/12/19
*/
public class Test1 {
public static void main(String[] args) {
CourseObservable courseObservable = new CourseObservable("权限管理");
TeacherObserver teacherWang = new TeacherObserver("Mr.Wang");
TeacherObserver teacherWu = new TeacherObserver("Mr.Wu");
courseObservable.addObserver(teacherWang);
courseObservable.addObserver(teacherWu);
//业务逻辑:学生提出问题 老师收到
Question question = new Question();
question.setQuestName("怎么解决循环依赖的问题");
question.setUsreName("小明");
courseObservable.productQuestion(question, courseObservable);
}
}
效果:
观察者模式的通用类图: