<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                22.2 觀察者模式的定義 觀察者模式(Observer Pattern)也叫做發布訂閱模式(Publish/subscribe),它是一個在項目中經常使用的模式,其定義如下: Define a one-to-many dependency between objects so that when one object changes state,all its dependents are notified and updated automatically.(定義對象間一種一對多的依賴關系,使得每當一個對象改變狀態,則所有依賴于它的對象都會得到通知并被自動更新。) 觀察者模式的通用類圖,如圖22-5所示。 ![](https://box.kancloud.cn/2016-08-14_57b003684ae2a.jpg) 圖22-5 觀察者模式通用類圖 我們先來解釋一下觀察者模式的幾個角色名稱: ● Subject被觀察者 定義被觀察者必須實現的職責,它必須能夠動態地增加、取消觀察者。它一般是抽象類或者是實現類,僅僅完成作為被觀察者必須實現的職責:管理觀察者并通知觀察者。 ● Observer觀察者 觀察者接收到消息后,即進行update(更新方法)操作,對接收到的信息進行處理。 ● ConcreteSubject具體的被觀察者 定義被觀察者自己的業務邏輯,同時定義對哪些事件進行通知。 ● ConcreteObserver具體的觀察者 每個觀察在接收到消息后的處理反應是不同,各個觀察者有自己的處理邏輯。 各個名詞介紹完畢,我們來看看各自的通用代碼,先看被觀察者角色,如代碼清單22-15所示。 代碼清單22-15 被觀察者 public?abstract?class?Subject?{ ?????//定義一個觀察者數組 ?????private?Vector<Observer>?obsVector?=?new?Vector<Observer>(); ?????//增加一個觀察者 ?????public?void?addObserver(Observer?o){ ?????????????this.obsVector.add(o); ?????} ?????//刪除一個觀察者 ?????public?void?delObserver(Observer?o){ ?????????????this.obsVector.remove(o); ?????} ?????//通知所有觀察者 ?????public?void?notifyObservers(){ ?????????????for(Observer?o:this.obsVector){ ?????????????????????o.update(); ?????????????} ?????} } 被觀察者的職責非常簡單,就是定義誰能夠觀察,誰不能觀察,程序中使用ArrayList和Vector沒有太大的差別,ArrayList是線程異步,不安全;Vector是線程同步,安全——就這點區別。我們再來看具體的被觀察者,如代碼清單22-16所示。 代碼清單22-16 具體被觀察者 public?class?ConcreteSubject?extends?Subject?{ ?????//具體的業務 ?????public?void?doSomething(){ ?????????????/* ??????????????*?do?something ??????????????*/ ?????????????super.notifyObservers(); ?????} } 我們現在看到的是一個純凈的觀察者,在具體項目中該類有很多的變種,在22.4一節中介紹。 我們再來看觀察者角色,如代碼清單22-17所示。 代碼清單22-17 觀察者 public?interface?Observer?{ ?????//更新方法 ?????public?void?update(); } 觀察者一般是一個接口,每一個實現該接口的實現類都是具體觀察者,如代碼清單22-18所示。 代碼清單22-18 具體觀察者 public?class?ConcreteObserver?implements?Observer?{ ?????//實現更新方法 ?????public?void?update()?{ ?????????????System.out.println("接收到信息,并進行處理!"); ?????} } 那其他模塊是怎么來調用的呢?我們編寫一個Client類來描述,如代碼清單22-19所示。 代碼清單22-19 場景類 public?class?Client?{ ?????public?static?void?main(String[]?args)?{ ?????????????//創建一個被觀察者 ?????????????ConcreteSubject?subject?=?new?ConcreteSubject(); ?????????????//定義一個觀察者 ?????????????Observer?obs=?new?ConcreteObserver(); ?????????????//觀察者觀察被觀察者 ?????????????subject.addObserver(obs); ?????????????//觀察者開始活動了 ?????????????subject.doSomething(); ?????} }
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看