觀察者模式(Observer Pattern)

介紹

觀察者模式(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");
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章