觀察者模式

觀察者模式html


  • 觀察者模式:全部依賴於定義對象間一種一對多的依賴關係,使得每當一個對象改變狀態,則全部依賴於它的對象都會獲得通知並被自動更新。
  • 觀察者模式的通用類圖以下:

 

咱們先來解釋一下觀察者模式中的幾個角色名稱:設計模式

    • Observer觀察者:觀察者接收到消息後,當即進行update()操做,對接收到的信息進行處理。
    • ConcreteObserver具體的觀察者:觀察者針對接收到的消息進行本身的邏輯處理。
    • Subject被觀察者:定義被觀察者必須實現的職責,它必須可以動態的增長、取消觀察者。實現對觀察者的管理和通知觀察者。
    • ConcreteSubject具體的被觀察者:定義被觀察者本身的業務邏輯,同時定義哪些事件進行通知。

觀察者模式的通用代碼以下:併發

複製代碼
public abstract class Observer { public abstract void update(); } public class Subject { private Vector<Observer> observers = new Vector<Observer>(); public void addObserver(Observer o){ observers.add(o); } public void delObserver(Observer o){ if(observers.remove(o)) System.out.println("the observer is removed"); } public void notifyObservers(){ for(Observer o : observers){ o.update(); } } } public class ConcreteObserver extends Observer{ @Override public void update() { // TODO Auto-generated method stub System.out.println("接收消息並進行處理"); /** * 本身的業務邏輯 */ } } public class ConCreteSubject extends Subject{ public void doSomething(){ /** * 本身的業務邏輯 */ super.notifyObservers(); } }
複製代碼
觀察者模式的優缺點
  • 觀察者模式的優勢
    • 觀察者和被觀察者之間是抽象耦合,如此設計無論是增長觀察者和被觀察者都很是容易擴展,並且在Java中已經實現了抽象層級的定義,在系統擴展方面更是駕輕就熟。
    • 創建一套觸發機制,造成一個觸發鏈。
  • 觀察者模式的缺點
    • 觀察者模式須要考慮一下併發效率問題,一個被觀察者,多個觀察者,開發和調試會比較複雜,並且Java中消息的通知默認是順序執行,一個觀察者卡殼,會影響總體的執行效率。在通常狀況下,須要考慮異步的方式。
觀察者模式的擴展

複製代碼
public class HanFeiZi extends Observable implements IHanFeiZi{ @Override public void haveBreakfast() { // TODO Auto-generated method stub super.setChanged(); super.notifyObservers("韓非子在吃飯"); } @Override public void haveFun() { // TODO Auto-generated method stub super.setChanged(); super.notifyObservers("韓非子在娛樂"); } } public class Lisi implements Observer{ @Override public void update(Observable o, Object arg) { // TODO Auto-generated method stub System.out.println("觀察者接收消息處理"); } } public class Client { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Lisi lisi = new Lisi(); HanFeiZi hanfeizi = new HanFeiZi(); hanfeizi.addObserver(lisi); hanfeizi.haveBreakfast(); } }
複製代碼
分類: 設計模式
相關文章
相關標籤/搜索