1. 程式人生 > >Java設計模式之觀察者模式(釋出/訂閱模式)

Java設計模式之觀察者模式(釋出/訂閱模式)

1、概述

觀察者模式又稱為釋出/訂閱(Publish/Subscribe)模式

觀察者設計模式涉及到兩種角色:主題(Subject)和觀察者(Observer)

(1)Subject模組
Subjec模組有3個主要操作

  • addObserver():註冊新增觀察者(申請訂閱)
  • deleteObserver():刪除觀察者(取消訂閱)
  • notifyObserver():主題狀態發生變化時通知所有的觀察者物件

(2)Oserver模組
Oserver模組有1個核心操作update(),當主題Subject狀態改變時,將呼叫每個觀察者的update()方法,更新通知。

2、簡單樣例

(1)主題介面

package observer;

public interface Subject {
    //新增觀察者
    void addObserver(Observer obj);
    //移除觀察者
    void deleteObserver(Observer obj);
    //當主題方法改變時,這個方法被呼叫,通知所有的觀察者
    void notifyObserver();
}

(2)觀察者介面

package observer;

public interface Observer {
    //當主題狀態改變時,更新通知
    public
void update(int version); }

(3)主題實現類,某某雜誌

package observer;

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

public class MagazineSubject implements Subject{
    //存放訂閱者
    private List<Observer> observers=new ArrayList<Observer>();
    //期刊版本
    private int version;

    @Override
public void addObserver(Observer obj) { observers.add(obj); } @Override public void deleteObserver(Observer obj) { int i = observers.indexOf(obj); if(i>=0){ observers.remove(obj); } } @Override public void notifyObserver() { for(int i=0;i<observers.size();i++){ Observer o=(Observer)observers.get(i); o.update(version); } } //該雜誌發行了新版本 public void publish(){ //新版本 this.version++; //資訊更新完畢,通知所有觀察者 notifyObserver(); } }

(4)觀察者實現類

package observer;

public class CustomerObserver implements Observer{
    //訂閱者名字
    private String name;
    private int version;

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

    @Override
    public void update(int version) {
        this.version=version;
        System.out.println("該雜誌出新版本了");
        this.buy();
    }

    public void buy(){
        System.out.println(name+"購買了第"+version+"期的雜誌!");
    }

}

(5)測試類

package observer;

public class Main{
    public static void main(String[] args) {
        //建立主題(被觀察者)
        MagazineSubject magazine = new MagazineSubject();
        //建立三個不同的觀察者
        CustomerObserver a = new CustomerObserver("A");
        CustomerObserver b = new CustomerObserver("B");
        CustomerObserver c = new CustomerObserver("C");
        //將觀察者註冊到主題中
        magazine.addObserver(a);
        magazine.addObserver(b);
        magazine.addObserver(c);

        //更新主題的資料,當資料更新後,會自動通知所有已註冊的觀察者
        magazine.publish();
    }
}

執行結果

該雜誌出新版本了
A購買了第1期的雜誌!
該雜誌出新版本了
B購買了第1期的雜誌!
該雜誌出新版本了
C購買了第1期的雜誌!

3、大資料運維平臺中的觀察者模式

這裡寫圖片描述