From 17796c46392d5a13b46e8d3d3d51adf30c9de07a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=E5=98=89=E9=98=B3?= Date: Thu, 5 Mar 2020 15:54:35 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=82=E5=AF=9F=E8=80=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pattern/behavior/observer/Course.java | 45 +++++++++++++++++++ .../pattern/behavior/observer/Question.java | 20 +++++++++ .../pattern/behavior/observer/Teacher.java | 41 +++++++++++++++++ .../behavior/observer/TeacherTest.java | 25 +++++++++++ 4 files changed, 131 insertions(+) create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/behavior/observer/Course.java create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/behavior/observer/Question.java create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/behavior/observer/Teacher.java create mode 100644 src/test/java/top/fjy8018/designpattern/pattern/behavior/observer/TeacherTest.java 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