23種設計模式(3)——觀察者模式
阿新 • • 發佈:2020-12-17
觀察者模式:觀察者模式(又被稱為釋出-訂閱(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都採用了觀察者模式