設計模式-觀察者模式

可進入個人博客查看原文。javascript

定義

觀察者模式定義了對象之間的一對多依賴,使得當一個對象改變狀態時,它的全部依賴者都會收到通知並自動更新。觀察者模式又叫發佈/訂閱模式java

角色

  • 抽象主題(Subject):它把全部觀察者對象的引用保存到一個列表裏,每一個主題均可以有任何數量的觀察者。抽象主題提供一個接口,能夠增長和刪除觀察者對象。ide

  • 具體主題(ConcreteSubject):將有關狀態存入具體觀察者對象;在具體主題內部狀態改變時,給全部登記過的觀察者發出通知。測試

  • 抽象觀察者(Observer):爲全部的具體觀察者定義一個接口,在獲得主題通知時更新本身。this

  • 具體觀察者(ConcreteObserver):實現抽象觀察者角色所要求的更新接口,以便使自己的狀態與主題狀態協調。spa

類圖

觀察者模式

示例

獵頭-求職者爲例。獵頭是主題,求職者是觀察者。設計

Subject 接口3d

public interface Subject {
    public void registerObserver(Observer o);
    public void removeObserver(Observer o);
    public void notifyAllObservers();
}複製代碼

Observer 接口code

public interface Observer {
    public void update(Subject s);
}複製代碼

HeadHunter 類實現 Subject 接口cdn

import java.util.LinkedList;

public class HeadHunter implements Subject {
    private LinkedList<Observer> userList;
    private LinkedList<String> jobs;

    public HeadHunter() {
        userList = new LinkedList<Observer>();
        jobs = new LinkedList<String>();
    }

    @Override
    public void registerObserver(Observer o) {
        userList.add(o);
    }

    @Override
    public void removeObserver(Observer o) {
        userList.remove(o);
    }

    @Override
    public void notifyAllObservers() {
        for (Observer o: userList) {
            o.update(this);
        }
    }

    public void addJob(String job) {
        jobs.add(job);
        notifyAllObservers();
    }

    public LinkedList<String> getJobs() {
        return jobs;
    }

    public String toString() {
        return jobs.toString();
    }
}複製代碼

JobSeeker 類實現 Observer 接口

public class JobSeeker implements Observer {
        private String name;

        public JobSeeker(String name) {
            this.name = name;
        }

        @Override
        public void update(Subject s) {
            System.out.println(this.name + " got notified!");
            System.out.println(s);
        }
}複製代碼

測試

public class Main {
    public static void main(String[] args) {
        HeadHunter hh = new HeadHunter();

        JobSeeker lbd = new JobSeeker("lbd");
        JobSeeker lbx = new JobSeeker("lbx");
        JobSeeker lbn = new JobSeeker("lbn");
        JobSeeker lbb = new JobSeeker("lbb");

        hh.registerObserver(lbd);
        hh.registerObserver(lbx);
        hh.registerObserver(lbn);
        hh.registerObserver(lbb);
        hh.removeObserver(lbb);

        hh.addJob("looking for Java engineers");
        hh.addJob("looking for Python engineers");
    }
}複製代碼

輸出

lbd got notified!
[looking for Java engineers]
lbx got notified!
[looking for Java engineers]
lbn got notified!
[looking for Java engineers]
lbd got notified!
[looking for Java engineers, looking for Python engineers]
lbx got notified!
[looking for Java engineers, looking for Python engineers]
lbn got notified!
[looking for Java engineers, looking for Python engineers]複製代碼

總結

觀察者模式使主題和觀察者之間鬆耦合,鬆耦合的設計可以讓咱們創建有彈性的OO系統,可以應對變化,由於對象直接的相互依賴降到了最低。

其餘

  • 上面的例子是觀察者模式的「推」模式,還有一種「拉」模式。
  • Java 的 java.util 庫裏面,提供了一個 Observable 類以及一個 Observer 接口,構成 Java 語言對觀察者模式的支持。

可進入個人博客查看原文。

相關文章
相關標籤/搜索