Java常用設計模式——觀察者模式
阿新 • • 發佈:2018-06-18
ray stat param servers face oid println override 角色
觀察者模式又叫做發布-訂閱-模式、模型-視圖-模式、源-監聽器-模式或者從屬者模式。觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態上發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己,它是一種行為型模式
觀察者模式所涉及的角色有:
- 抽象主題(Subject)角色:抽象主題角色把所有對觀察者對象的引用保存在一個聚集(比如ArrayList對象)裏,每個主題都可以有任何數量的觀察者。抽象主題提供一個接口,可以增加和刪除觀察者對象,抽象主題角色又叫做抽象被觀察者(Observable)角色
- 具體主題(ConcreteSubject)角色:
- 抽象觀察者(Observer)角色:為所有的具體觀察者定義一個接口,在得到主題的通知時更新自己,這個接口叫做更新接口
- 具體觀察者(ConcreteObserver)角色:存儲與主題的狀態自恰的狀態。具體觀察者角色實現抽象觀察者角色所要求的更新接口,以便使本身的狀態與主題的狀態 像協調。如果需要,具體觀察者角色可以保持一個指向具體主題對象的引用
定義抽象主題角色
package com.observerpattern;/** * @author yyx 2017年10月10日 */ public interface Subject { /** * 添加觀察者對象 * * @param observer */ public void addObserver(Observer observer); /** * 移除觀察者對象 * * @param observer */ public void removeObserver(Observer observer); /** * 更新觀察者對象信息*/ public void notifyObservers(); }
定義具體主題角色
package com.observerpattern; import java.util.ArrayList; import java.util.List; /** * @author yyx 2017年10月10日 */ public class ConcreteSubject implements Subject { private List<Observer> observerList = new ArrayList<Observer>(); @Override public void addObserver(Observer observer) { observerList.add(observer); } @Override public void removeObserver(Observer observer) { observerList.remove(observer); } @Override public void notifyObservers() { for (Observer observer : observerList) { observer.update(); } } }
定義抽象觀察者角色
package com.observerpattern; /** * @author yyx 2017年10月10日 * 抽象觀察者角色 */ public interface Observer { public void update(); }
定義具體觀察者角色
package com.observerpattern; /** * @author yyx 2017年10月10日 * 具體觀察者角色 */ public class ConcreteObserverFirst implements Observer { @Override public void update() { System.out.println("我是第一個實現Observer接口的類"); } } package com.observerpattern; /** * @author yyx 2017年10月10日 * 具體觀察者角色 */ public class ConcreteObserverSecond implements Observer { @Override public void update() { System.out.println("我是第二個實現Observer接口的類"); } }
定義測試類
package com.observerpattern; /** * @author yyx 2017年10月10日 */ public class PatternTest { public static void main(String[] args) { Subject subject = new ConcreteSubject(); Observer observerFirst = new ConcreteObserverFirst(); Observer observerSecond = new ConcreteObserverSecond(); subject.addObserver(observerFirst); subject.addObserver(observerSecond); subject.notifyObservers(); } } 運行結果: 我是第一個實現Observer接口的類 我是第二個實現Observer接口的類
Java常用設計模式——觀察者模式