介紹
觀察者模式(Observer Pattern)定義了對象之間的一對多依賴,讓多個觀察者對象同 時監聽一個主體對象,當主體對象發生變化時,它的所有依賴者(觀察者)都會收到通 知並更新,屬於行爲型模式。
優點
1、觀察者和被觀察者之間建立了一個抽象的耦合。
2、觀察者模式支持廣播通信。
缺點
1、觀察者之間有過多的細節依賴、提高時間消耗及程序的複雜度。
2、使用要得當,要避免循環調用。
使用場景
微信朋友圈動態通知、CSDN生態圈消息通知、郵件通知、廣播通知、桌面程序等
使用建議
觀察模式實際開發中使用的較少,一般涉及到觀察者的地方都用三方MQ消息組件替代。
具體實現
(實例一)JDK實現:老師監聽學生提交作業
類圖
代碼
package com.knowledge.system.software_design_pattern.observer_pattern.course_instance.jdk;
import lombok.Data;
public class Question {
private String userName;
private String content;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
package com.knowledge.system.software_design_pattern.observer_pattern.course_instance.jdk;
import java.util.Observable;
import java.util.Observer;
public class Teacher implements Observer {
private String name;
public Teacher(String name) {
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
HomeWork homeWork=(HomeWork)o;
Question question=(Question)arg;
System.out.println("++++++++++++消息實時通知++++++++++++++");
System.out.println(name+"老師,你好\n"+
"你收到一條來自:"+homeWork.getName()+" 作業提交,提問者:" +question.getUserName()+"問題內容:\n"+
question.getContent()+"\n"+
"");
}
}
package com.knowledge.system.software_design_pattern.observer_pattern.course_instance.jdk;
import java.util.Observable;
public class HomeWork extends Observable {
private String name="學生作業統一管理平臺";
private static HomeWork homeWork=null;
private HomeWork(){}
public static HomeWork getIntance(){
if(null==homeWork){
homeWork=new HomeWork();
}
return homeWork;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void publichQuestion(Question question){
System.out.println(question.getUserName()+"提了一個問題,內容是:\n"+question.getContent());
setChanged();
notifyObservers(question);
}
}
(實例二)使用guava實現一個簡單的觀察者
package com.knowledge.system.software_design_pattern.observer_pattern.course_instance.guava;
import com.google.common.eventbus.Subscribe;
public class GuavaEvent {
@Subscribe
public void subscribe(String str){
System.out.println("執行subscribe方法,傳入參數是:"+str);
}
}
package com.knowledge.system.software_design_pattern.observer_pattern.course_instance.guava;
import com.google.common.eventbus.EventBus;
public class Test {
public static void main(String[] args) {
EventBus eventBus=new EventBus();
GuavaEvent guavaEvent=new GuavaEvent();
eventBus.register(guavaEvent);
eventBus.post("boubou");
}
}