1. 程式人生 > 其它 >23種設計模式(3)——觀察者模式

23種設計模式(3)——觀察者模式

技術標籤:設計模式設計模式java

觀察者模式:觀察者模式(又被稱為釋出-訂閱(Publish/Subscribe)模式,屬於行為型模式的一種,它定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某一個主題物件。這個主題物件在狀態變化時,會通知所有的觀察者物件,使他們能夠自動更新自己。
package com.cjian.GOF;

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

/**
 * @description: 觀察者模式 
 * @author: CJ
 * @time: 2020/12/16 15:16
 */
public class ObserverDemo {
    public static void main(String[] args) {
        Subjecter subjecter = new Subjecter();
        Observer1 o1 = new Observer1();
        Observer2 o2 = new Observer2();
        //新增觀察者
        subjecter.addObserver(o1);
        subjecter.addObserver(o2);
        //通知觀察者
        subjecter.notifyObserver("我釋出了一個訊息");
        //移除一個觀察者
        subjecter.removeObserver(o1);
        //再次通知觀察者
        subjecter.notifyObserver("我又釋出了一個訊息");

    }

}

//主題
interface Subject {
    void addObserver(Observer observer);

    void notifyObserver(String msg);

    void removeObserver(Observer observer);
}

//主題的實現
class Subjecter implements Subject {

    private static List<Observer> observerlist = new ArrayList<>();

    @Override
    public void addObserver(Observer observer) {
        observerlist.add(observer);
    }

    @Override
    public void notifyObserver(String msg) {
        for (Observer ob : observerlist) {
            ob.doSomeThing(msg);
        }
    }

    @Override
    public void removeObserver(Observer observer) {
        observerlist.remove(observer);
    }
}
//訂閱者
interface Observer {
    void doSomeThing(String msg);
}
//訂閱者的實現
class Observer1 implements Observer {
    @Override
    public void doSomeThing(String msg) {
        System.out.println("觀察者1接到了通知:"+msg);
    }
}

class Observer2 implements Observer {
    @Override
    public void doSomeThing(String msg) {
        System.out.println("觀察者2接到了訊息:"+msg);
    }
}

輸出:

jdk中的Observable(主題)、Observer(觀察者)類以及Spring的時間驅動ApplicationListener都採用了觀察者模式