观察者
This commit is contained in:
@@ -0,0 +1,45 @@
|
|||||||
|
package top.fjy8018.designpattern.pattern.behavior.observer;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
|
import java.util.EventListener;
|
||||||
|
import java.util.Observable;
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 课程
|
||||||
|
* 被观察者类
|
||||||
|
* <p>
|
||||||
|
* {@link Observable} 使用 {@link Vector} 保证线程安全
|
||||||
|
* <p>
|
||||||
|
* JDK源码
|
||||||
|
* {@link java.awt.Event} 事件监听器
|
||||||
|
* {@link javax.servlet.ServletRequestListener} HTTP请求事件监听器
|
||||||
|
* 继承 {@link EventListener},有大量实现,例如{@link org.springframework.beans.factory.parsing.ReaderEventListener}
|
||||||
|
*
|
||||||
|
* @author F嘉阳
|
||||||
|
* @date 2020/3/5 15:23
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class Course extends Observable {
|
||||||
|
|
||||||
|
private String courseName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 产生问题
|
||||||
|
*
|
||||||
|
* @param course
|
||||||
|
* @param question
|
||||||
|
*/
|
||||||
|
public void produceQuestion(Course course, Question question) {
|
||||||
|
log.info("{}在{}提交了一个问题", question.getUsername(), course.getCourseName());
|
||||||
|
// 状态变化
|
||||||
|
setChanged();
|
||||||
|
// 通知观察者
|
||||||
|
notifyObservers(question);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package top.fjy8018.designpattern.pattern.behavior.observer;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 课程问题
|
||||||
|
*
|
||||||
|
* @author F嘉阳
|
||||||
|
* @date 2020/3/5 15:23
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class Question {
|
||||||
|
|
||||||
|
private String username;
|
||||||
|
|
||||||
|
private String content;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
package top.fjy8018.designpattern.pattern.behavior.observer;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
|
import java.util.Observable;
|
||||||
|
import java.util.Observer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 老师实体
|
||||||
|
* <p>
|
||||||
|
* 老师观察课程是否产生了新的问题
|
||||||
|
*
|
||||||
|
* @author F嘉阳
|
||||||
|
* @date 2020/3/5 15:24
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class Teacher implements Observer {
|
||||||
|
|
||||||
|
private String teacherName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is called whenever the observed object is changed. An
|
||||||
|
* application calls an <tt>Observable</tt> object's
|
||||||
|
* <code>notifyObservers</code> method to have all the object's
|
||||||
|
* observers notified of the change.
|
||||||
|
*
|
||||||
|
* @param o the observable object.
|
||||||
|
* @param arg an argument passed to the <code>notifyObservers</code>
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void update(Observable o, Object arg) {
|
||||||
|
Course course = (Course) o;
|
||||||
|
Question question = (Question) arg;
|
||||||
|
log.info("{}老师的{}课程接收到一个{}提交的问题,内容为:{}",
|
||||||
|
teacherName, course.getCourseName(), question.getUsername(), question.getContent());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package top.fjy8018.designpattern.pattern.behavior.observer;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author F嘉阳
|
||||||
|
* @date 2020/3/5 15:36
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
class TeacherTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void update() {
|
||||||
|
Course course = new Course("Java设计模式");
|
||||||
|
Teacher teacher = new Teacher("fjy8018");
|
||||||
|
|
||||||
|
course.addObserver(teacher);
|
||||||
|
|
||||||
|
// 业务逻辑
|
||||||
|
Question question = new Question("fjy", "问题内容XXX");
|
||||||
|
|
||||||
|
course.produceQuestion(course, question);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user