一、觀察者模式介紹
1、定義與型別
定義:定義了物件之間的一對多依賴,讓多個觀察者物件同時監聽某一個主題物件,當主題物件發生變化時,它的所有依賴者(觀察者)都會收到通知并更新
型別:行為型
2、適用場景
關聯行為場景,建立一套觸發機制
例如:朋友圈點贊后的其他人評論提醒,網店商品的降價提醒,論壇帖子被回復的提醒
3、優點
觀察者和被觀察者之間建立一個抽象的耦合
觀察者模式支持廣播通信
4、缺點
觀察者之間有過多的細節依賴、提高時間消耗及程式復雜度
使用要得當,要避免回圈呼叫
二、代碼示例
模擬場景:學生在課程上提了問題,老師作為觀察者,需要接收到問題,其中老師(觀察者)可能有多個,
JDK本身就提供了觀察者模式的實作支持
通知者(可被觀察):java.util.Observable
觀察者:java.util.Observer
問題類:
public class Question {
private String userName;
private String questionContent;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getQuestionContent() {
return questionContent;
}
public void setQuestionContent(String questionContent) {
this.questionContent = questionContent;
}
}
課程類:
public class Course extends Observable {
private String courseName;
public String getCourseName() {
return courseName;
}
public Course(String courseName) {
this.courseName = courseName;
}
public void produceQuestion(Course course, Question question){
System.out.println(question.getUserName() + " 在 " + course.getCourseName() + " 提交了一個問題");
// 呼叫 Observable 的方法
setChanged();
notifyObservers(question);
}
}
老師類:
public class Teacher implements Observer {
private String teacherName;
public Teacher(String teacherName) {
this.teacherName = teacherName;
}
@Override
public void update(Observable o, Object arg) {
// 如果業務復雜或者并發量大,也可改成異步
Course course = (Course) o;
Question question = (Question) arg;
System.out.println(teacherName + " 老師的 " + course.getCourseName() + " 課程接收到 " + question.getUserName() + " 提交的問題:" + question.getQuestionContent());
}
}
測驗類:
public class Test {
public static void main(String[] args) {
Course course = new Course("觀察者模式");
Teacher teacher1 = new Teacher("Alpha");
Teacher teacher2 = new Teacher("Beta");
// 添加觀察者
course.addObserver(teacher1);
course.addObserver(teacher2);
// 業務邏輯代碼
Question question = new Question();
question.setUserName("某學生");
question.setQuestionContent("JAVA的主函式如何撰寫");
course.produceQuestion(course, question);
}
}
輸出:
某學生 在 觀察者模式 提交了一個問題
Beta 老師的 觀察者模式 課程接收到 某學生 提交的問題:JAVA的主函式如何撰寫
Alpha 老師的 觀察者模式 課程接收到 某學生 提交的問題:JAVA的主函式如何撰寫
三、原始碼示例
Guava中的GuavaEvent

測驗:
觀察者類:
import com.google.common.eventbus.Subscribe;
public class GuavaEvent {
@Subscribe
public void subscribe(String str) {
// 業務邏輯
System.out.println("執行subscribe,傳入的引數為 " + str);
}
}
測驗類:
public class GuavaEventTest {
public static void main(String[] args) {
EventBus eventBus = new EventBus();
GuavaEvent guavaEvent = new GuavaEvent();
eventBus.register(guavaEvent);
eventBus.post("post的內容");
}
}
輸出:執行subscribe,傳入的引數為 post的內容
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/6019.html
標籤:設計模式
上一篇:設計模式:思維導圖
