diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/observer/Course.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/observer/Course.java new file mode 100644 index 0000000..d9a6abb --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/observer/Course.java @@ -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; + +/** + * 课程 + * 被观察者类 + *

+ * {@link Observable} 使用 {@link Vector} 保证线程安全 + *

+ * 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); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/observer/Question.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/observer/Question.java new file mode 100644 index 0000000..40e881c --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/observer/Question.java @@ -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; + +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/observer/Teacher.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/observer/Teacher.java new file mode 100644 index 0000000..292b44a --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/observer/Teacher.java @@ -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; + +/** + * 老师实体 + *

+ * 老师观察课程是否产生了新的问题 + * + * @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 Observable object's + * notifyObservers method to have all the object's + * observers notified of the change. + * + * @param o the observable object. + * @param arg an argument passed to the notifyObservers + */ + @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()); + } +} diff --git a/src/test/java/top/fjy8018/designpattern/pattern/behavior/observer/TeacherTest.java b/src/test/java/top/fjy8018/designpattern/pattern/behavior/observer/TeacherTest.java new file mode 100644 index 0000000..b060c31 --- /dev/null +++ b/src/test/java/top/fjy8018/designpattern/pattern/behavior/observer/TeacherTest.java @@ -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); + } +} \ No newline at end of file