設(shè)計(jì)模式之觀察者

觀察者模式


一、定義

觀察者模式有時(shí)候稱為“發(fā)布-訂閱”模式,一個(gè)目標(biāo)物件管理所有相依于它的觀察者物件,并且在它本身的狀態(tài)改變時(shí)主動發(fā)出通知。這通常透過呼叫各觀察者所提供的方法來實(shí)現(xiàn)。此種模式通常被用來實(shí)現(xiàn)事件處理系統(tǒng)。

簡介

觀察者模式(Observer)完美的將觀察者被觀察的對象分離開。舉個(gè)例子,用戶界面可以作為一個(gè)觀察者業(yè)務(wù)數(shù)據(jù)被觀察者,用戶界面觀察業(yè)務(wù)數(shù)據(jù)的變化,發(fā)現(xiàn)數(shù)據(jù)變化后,就顯示在界面上。面向?qū)ο笤O(shè)計(jì)的一個(gè)原則是:系統(tǒng)中的每個(gè)類將重點(diǎn)放在某一個(gè)功能上,而不是其他方面。一個(gè)對象只做一件事情,并且將他做好。觀察者模式在模塊之間劃定了清晰的界限,提高了應(yīng)用程序的可維護(hù)性和重用性。
觀察者設(shè)計(jì)模式定義了對象間的一種一對多的依賴關(guān)系,以便一個(gè)對象的狀態(tài)發(fā)生變化時(shí),所有依賴于它的對象都得到通知并自動刷新。

二、代碼展示

import java.util.ArrayList;
import java.util.List;

/**
 * Created by yuwu on 2017/8/31.
 */
public class ObserverPattern {
    public static void main(String[] args) {
        Student tony = new Student();//聲明學(xué)生對象tony
        Teacher teacher = new Teacher(tony);//創(chuàng)建觀察者對象【老師】,觀察對象【tony】
        Parent parent = new Parent(tony);//創(chuàng)建觀察者對象【父母】,觀察對象【tony】
        tony.setScore(80, 80);//tony的成績改動
        tony.setScore(123, 123);//tony的成績改動
    }
}

/**
 * 【發(fā)布】接口 或者稱為 【被觀察者接口】
 */
interface Subject {
    /**
     * 注冊觀察者
     *
     * @param observer
     */
    void registerObserver(Observer observer);

    /**
     * 移除觀察者
     *
     * @param observer
     */
    void removeObserver(Observer observer);

    /**
     * 通知觀察者
     */
    void notifyObserver();
}

/**
 * 【訂閱】接口,或者稱為【觀察者】接口
 */
interface Observer {
    /**
     * 觀察者操作
     */
    void update();
}

/**
 * 學(xué)生類,作為被觀察者
 */
class Student implements Subject {

    private int mathScore;
    private int englishScore;

    public int getMathScore() {
        return mathScore;
    }

    public void setMathScore(int mathScore) {
        this.mathScore = mathScore;
    }

    public int getEnglishScore() {
        return englishScore;
    }

    public void setEnglishScore(int englishScore) {
        this.englishScore = englishScore;
    }

    private List<Observer> observerList;

    public Student() {
        observerList = new ArrayList<>();
        mathScore = 100;
        englishScore = 100;
    }

    public void setScore(int mathScore, int englishScore) {
        this.mathScore = mathScore;
        this.englishScore = englishScore;
        notifyObserver();
    }

    @Override
    public void registerObserver(Observer observer) {
        observerList.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        observerList.remove(observer);
    }

    @Override
    public void notifyObserver() {
        observerList.forEach((observer1) -> observer1.update());
    }


}

/**
 * 【觀察者】父母類
 */
class Parent implements Observer {

    private Student student;

    public Parent(Student student) {
        this.student = student;
        student.registerObserver(this);
    }

    @Override
    public void update() {
        System.out.println("Tell Parent: Your Child Get :" + "English: " +
                student.getEnglishScore() + " 、" + "Math: " + student.getMathScore());
    }
}

/**
 * 【觀察者】老師類
 */
class Teacher implements Observer {

    private Student student;

    public Teacher(Student student) {
        this.student = student;
        student.registerObserver(this);
    }

    @Override
    public void update() {
        System.out.println("Tell Teacher: Your Child Get :" + "English: " +
                student.getEnglishScore() + " 、" + "Math: " + student.getMathScore());
    }
}

輸出:

Tell Teacher: Your Child Get :English: 80 、Math: 80
Tell Parent: Your Child Get :English: 80 、Math: 80
Tell Teacher: Your Child Get :English: 123 、Math: 123
Tell Parent: Your Child Get :English: 123 、Math: 123

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 觀察者模式 Rxjava中運(yùn)用到了觀察者模式,那什么是觀察者模式呢,現(xiàn)在來學(xué)習(xí)一下。正所謂觀察,就是看,細(xì)察事物的...
    cgzysan閱讀 621評論 0 4
  • 客戶需求 程序設(shè)計(jì) 一個(gè)氣象站對應(yīng)著多個(gè)客戶端,氣象站的數(shù)據(jù)一發(fā)生變化,客戶端的數(shù)據(jù)也要隨著更新,這就形成了一種依...
    BlainPeng閱讀 1,111評論 1 17
  • 觀察者模式 有時(shí),我們希望在一個(gè)對象的狀態(tài)改變時(shí)更新另外一組對象。在MVC模式中有這樣一個(gè)非常常見的例子,假設(shè)在兩...
    英武閱讀 4,303評論 0 51
  • 1 定義 定義對象之間的一種一對多依賴關(guān)系,使得每當(dāng)一個(gè)對象狀態(tài)發(fā)生改變時(shí),其相關(guān)依賴對象皆得到通知并被自動更新。...
    菜小軒526閱讀 590評論 3 3
  • 在正式介紹觀察者模式前,我們先引用生活中的小例子來模擬觀察者,先對觀察者模式有一個(gè)整體的感覺。 現(xiàn)實(shí)模擬 報(bào)紙和雜...
    六尺帳篷閱讀 1,702評論 6 18

友情鏈接更多精彩內(nèi)容