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