設(shè)計(jì)模式——觀察者模式

設(shè)計(jì)模式——觀察者模式

很好理解的例子

例子:李斯監(jiān)控韓非子衣食住行

一個(gè)抽象接口:被觀察者接口

  public interface Observable{
    public void addObserver(Obeserver observer);
    public void deleteObserver(Observer observer);
    public void notifyObserver(String context);
  }
  //韓非子自己的特定動(dòng)作
  public interface IHanFeiZi{
    public void haveBreakfast();
    public void haveFun();
  }
  public class HanFeiZi implements IHanFeiZi,Observable {
    // 定義個(gè)變長(zhǎng)數(shù)組,存放所有的觀察者
    private ArrayList<Observer> observerList = new ArrayList<Observer>;
    public void addObserver(Obeserver observer){
      this.observerList.add(observer);
    }
    public void deleteObserver(Observer observer){
      this.observerList.remove(observer);
    }
    public void notifyObserver(String context){
      for(Observer observer:observerList){
        observer.update(context);
      }
    }
    public void haveBreakfast(){
      //doSomething
      this.notifyObserver("isHavingBreakfast");
    }
    public void haveFun(){
      // doSomething
      this.notifyObserver("isHavingFun");
    }

  }

一個(gè)抽象接口:抽象觀察者

  public interface Observer{
    public void update(String context);
  }

  public class Lisi implements Observer{
    public void update(String str){
      // doSomething
      this.reportToQinShiHuang(str);
    }
    private void reportToQinShiHuang(String reportContext){
      System.out.println(reportContext);
    }
  }

場(chǎng)景類

  public class Client(){
    public static void main(String[] args) throws InterruptedExeption{
      Observer liSi = new LiSi();
      Observer wangSi = new WangSi();
      Observer liuSi = new LiuSi();
      // ...一系列Observer
      HanFeiZi hanFeiZi = new HanFeiZi();
      hanFeiZi.addObserver(liSi);
      hanFeiZi.addObserver(wangSi);
      hanFeiZi.addObserver(liuSi);
      hanFeiZi.haveBreakfast();
      HanFeiZi.haveFun();
    }
  }

觀察者模式(發(fā)布/訂閱)總結(jié)

定義

Define a one- to- many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.
定義對(duì)象間一種一對(duì)多的依賴關(guān)系使得每當(dāng)一個(gè)對(duì)象改變狀態(tài),則所有依賴于它的對(duì)象都會(huì)得到更新

觀察者模式
  • Subject被觀察者
  定義被觀察者必須實(shí)現(xiàn)的職責(zé),它必須能夠動(dòng)態(tài)地增加,取消觀察則會(huì)。它一般是抽象類或者是實(shí)現(xiàn)類,僅僅完成作為被觀察者必須實(shí)現(xiàn)的職責(zé);管理觀察者并通知觀察者
  //ArrayList是線程異步,不安全
  //Vector是線程同步,安全
  public abstract class Subject{
    private Vector<Observer> obsVector = new Vector<Observer>();
    public void addObserver(Observer observer){
      this.obsVector.add(observer);
    }
    public void deleteObserver(Observer observer){
      this.obsVector.remove(observer);
    }
    public void notifyObserver(){
      for(Observer observer: this.obsVector ){
        observer.update();
      }
    }
  }
  • Observer觀察者
   觀察者接收到消息后,即進(jìn)行update操作,對(duì)接收到的信息進(jìn)行處理
  // 觀察者一般是一個(gè)接口
  public interface Observer{
    public void update();
  }
  • ConcreteSubject具體的被觀察者
  定義被觀察者自己的業(yè)務(wù)邏輯,同時(shí)定義對(duì)哪些時(shí)間進(jìn)行通知
  public class ConcreteSubject extends Subject{
    public void doSomething(){
      /**
       * doSomething;
       */
      super.notifyObserver();
    }
  }
  • ConcreteObserver具體的觀察者
  每個(gè)觀察在接收到消息后的處理反應(yīng)是不同,每個(gè)觀察者都有自己的處理邏輯
  public class ConcreteObserver implements Observer{
    public void update(){
      /**
       * doSomething
       */
    System.out.println("接收消息");
    }
  }
  • 場(chǎng)景類
  public class Client{
    public static void main(String[] args) {
      ConcreteSubject subject = new ConcreteSubject();
      Observer observer = new ConcreteObserver();
      //...重復(fù)多個(gè)Observer觀察對(duì)象
      subject.addObserver(observer);
      subject.doSomething();
    }
  }

觀察者模式的優(yōu)缺點(diǎn)

觀察者模式的優(yōu)點(diǎn)
  • 觀察者與被觀察者之間是抽象耦合
  • 建立一套觸發(fā)機(jī)制
觀察者模式的缺點(diǎn)
  • 一個(gè)觀察者卡殼,會(huì)影響著整體的執(zhí)行效率,一般采用異步的方式

觀察者模式的適用場(chǎng)景

  • 關(guān)聯(lián)行為場(chǎng)景
  • 事件多級(jí)觸發(fā)場(chǎng)景
  • 跨系統(tǒng)的消息交換場(chǎng)景
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容