<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                **定義**:定義對象間一種一對多的依賴關系,使得每當一個對象改變狀態,則所有依賴于它的對象都會得到通知并被自動更新。 ## 一般模式 ![](https://box.kancloud.cn/2016-06-06_5755340bd8b1c.jpg) Subject被觀察者 ---|定義被觀察者必須實現的職責,它必須能夠動態的增加、取消觀察者,一般是抽象類或者實現類,完成管理觀察者并通知觀察者。 Observer觀察者 ---|觀察者接到信息后,進行update操作 ConcreteSubject具體的被觀察者 ---|定義被觀察者自己的業務邏輯,同時定義對那些事件進行通知 ConcreteObserver具體的觀察者 ---|每個觀察者在接收到信息后的處理反應是不同的,各個觀察者有自己的處理邏輯。 ~~~ public class ObserverTest { public static void main(String[] args) { //創建一個唄觀察者 ConcreteSubject con = new ConcreteSubject(); //創建一個觀察者 Observer observer = new ConcreteObserver(); //添加到被觀察者類中 con.addObserver(observer); //完成某項任務,實現更新 con.doSomething(); } } /** * 觀察者接口,所有觀察者要實現該接口。 * 實現方法, 處理不同的業務邏輯。 * @author admin * */ interface Observer{ public void update(); } /** * 具體的觀察者實現類。 * @author admin * */ class ConcreteObserver implements Observer{ @Override public void update() { System.out.println("觀察者接收到信息,去實現業務邏輯......."); } } /** * 被觀察者抽象類, * 主要對觀察者的操作,增加、刪除、通知所有觀察者等方法。 * @author admin * */ abstract class Subject{ //定義一個觀察者集合 private List<Observer> observerList = new ArrayList<Observer>(); //添加一個觀察者 public void addObserver(Observer o){ this.observerList.add(o); } //刪除一個觀察者 public void removeObserver(Observer o){ this.observerList.remove(o); } //通知所有的觀察者 public void notifyObserver(){ for(Observer o : observerList){ o.update(); } } } /** * 被觀察者的具體實現類, * 當被觀察者完成某種操作以后, * 觀察者會產生相應的更新操作 * @author admin */ class ConcreteSubject extends Subject{ public void doSomething(){ System.out.println("被觀察者完成操作...."); super.notifyObserver(); } } ~~~ ## 一個例子: 韓國的韓非子是一個十分重要的任務,因此他身邊被安插好多各個國家的間諜,來監視他的一舉一動。 當韓非子有任何的行動間諜都要做相應的變化。 ![](https://box.kancloud.cn/2016-06-06_5755340bf37b9.jpg) ~~~ public class ObserverT { public static void main(String[] args) { //創建一個被觀察者 HanFeiZi hfz = new HanFeiZi(); //創建一個李斯觀察者 IObserver lisi = new Lisi(); //創建一個序言觀察者 IObserver xuyan = new XuYan(); //添加觀察者.. hfz.addOberver(lisi); hfz.addOberver(xuyan); //韓非子吃飯.. hfz.haveBreakfast(); } } /** * 被觀察者的接口類, * 定義其日常的行為方法。 * @author admin * */ interface IHanFeiZi{ //吃飯 void haveBreakfast(); //娛樂 void haveFun(); } /** * 被觀察者的接口類, * 定義其對身邊間諜的增加、刪除、通知所有間諜的方法 * @author admin * */ interface IObservable{ void addOberver(IObserver o); void removeObserver(IObserver o); void notifyObserver(String context); } class HanFeiZi implements IHanFeiZi,IObservable{ //定義一個監聽者集合 private List<IObserver> observerList = new ArrayList<IObserver>(); @Override public void addOberver(IObserver o) { this.observerList.add(o); } @Override public void removeObserver(IObserver o) { this.observerList.remove(o); } @Override public void notifyObserver(String context) { for(IObserver o : observerList){ o.update(context); } } @Override public void haveBreakfast() { System.out.println("----韓非子開始吃飯了..."); this.notifyObserver("----韓非子在吃飯....."); } @Override public void haveFun() { System.out.println("----韓非子開始娛樂了..."); this.notifyObserver("----韓非子在娛樂....."); } } /** * 觀察者接口類, * 實現該類的子類,對被觀察者的舉動進行相應的業務邏輯更新。 * @author admin * */ interface IObserver{ public void update(String context); } /** * 具體是觀察者實現類.. * @author admin */ class Lisi implements IObserver{ @Override public void update(String context) { System.out.println("李斯接收到消息,向皇帝報告:"); this.reportToBoss(context); System.out.println("皇帝沒有責罰我,我很開心..."); } private void reportToBoss(String info){ System.out.println("報告老板,"+info); } } class XuYan implements IObserver{ @Override public void update(String context) { System.out.println("序言接收到消息,想丈夫匯報:"); this.reportToHasband(context); System.out.println("序言表現很好.."); } public void reportToHasband(String info){ System.out.println("報告老公:"+info); } } ~~~ ## 觀察者模式 的擴展 ---|java世界中的觀察者模式 java.util.Observer接口和java.util.Observable實現類 為我們提供了觀察者模式。 被觀察者只需要繼承Observable類,就可以實現對監聽者的添加、刪除、通知等方法, 觀察者只要實現Observer接口,就可以完成相應的更新操作。 ![](https://box.kancloud.cn/2016-06-06_5755340c2353d.jpg) ~~~ public class ObserverT { public static void main(String[] args) { //創建一個被觀察者 HanFeiZi hfz = new HanFeiZi(); //創建一個李斯觀察者 Observer lisi = new Lisi(); //創建一個序言觀察者 Observer xuyan = new XuYan(); //添加觀察者.. hfz.addObserver(lisi); hfz.addObserver(xuyan); //韓非子吃飯.. hfz.haveBreakfast(); } } /** * 被觀察者的接口類, * 定義其日常的行為方法。 * @author admin * */ interface IHanFeiZi{ //吃飯 void haveBreakfast(); //娛樂 void haveFun(); } class HanFeiZi extends Observable implements IHanFeiZi { @Override public void haveBreakfast() { System.out.println("----韓非子開始吃飯了..."); /* * 如果 hasChanged 方法指示對象已改變,則通知其所有觀察者, * 并調用 clearChanged 方法來指示此對象不再改變。 */ super.setChanged(); super.notifyObservers("韓非子在吃飯..."); } @Override public void haveFun() { System.out.println("----韓非子開始娛樂了..."); /* * 如果 hasChanged 方法指示對象已改變,則通知其所有觀察者, * 并調用 clearChanged 方法來指示此對象不再改變。 */ super.setChanged(); super.notifyObservers("韓非子在娛樂..."); } } /** * 具體是觀察者實現類.. * @author admin */ class Lisi implements Observer{ @Override public void update(Observable o, Object arg) { System.out.println("李斯接收到消息,向皇帝報告:"); this.reportToBoss(arg); System.out.println("皇帝沒有責罰我,我很開心..."); } private void reportToBoss(Object info){ System.out.println("報告老板,"+info); } } /** * 具體是觀察者實現類.. * @author admin */ class XuYan implements Observer{ @Override public void update(Observable o, Object arg) { System.out.println("序言接收到消息,想丈夫匯報:"); this.reportToHasband(arg); System.out.println("序言表現很好.."); } public void reportToHasband(Object info){ System.out.println("報告老公:"+info); } } ~~~ 觀察者模式的優點 ---|觀察者和被觀察者之間是抽象耦合 ---|建立一套觸發機制 觀察者模式的缺點: ---|觀察者模式的效率問題 觀察者的使用場景 ---|關聯行為場景,需要注意的是,關聯行為是可拆分的,而不是”組合“關系 ---|事件多級觸發場景 ---|跨系統的消息交換場景,如消息隊列的處理機制
                  <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>

                              哎呀哎呀视频在线观看