观察者

This commit is contained in:
2020-03-05 15:54:35 +08:00
parent be992c42ac
commit 17796c4639
4 changed files with 131 additions and 0 deletions

View File

@@ -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);
}
}

View File

@@ -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;
}

View File

@@ -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());
}
}

View File

@@ -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);
}
}