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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 觀察者設計模式 > 原文: [https://howtodoinjava.com/design-patterns/behavioral/observer-design-pattern/](https://howtodoinjava.com/design-patterns/behavioral/observer-design-pattern/) 根據 GoF 定義,**觀察者模式**定義了對象之間的一對多依賴關系,因此當一個對象更改狀態時,將自動通知并更新其所有依賴關系。 它也稱為**發布 - 訂閱模式**。 在觀察者模式中,有許多觀察者(訂閱者對象)正在觀察特定的主題(發布者對象)。 觀察者將自己注冊到某個主題時,可以在該主題內部進行更改時得到通知。 觀察者對象可以在任何時間點從主體注冊或注銷。 它有助于使對象**與對象**松散耦合。 ## 1.何時使用觀察者設計模式 如上所述,當您設計一個系統時,多個實體對某個特定的第二個實體對象的任何可能更新感興趣,我們可以使用觀察者模式。 ![Observer Pattern](https://img.kancloud.cn/76/8f/768f5cb7be680698efaae02d91340f16_640x315.png) 觀察者模式 該流程非常簡單易懂。 應用創建具體的主題對象。 所有具體的觀察者都會進行注冊,以便隨時了解主題狀態的任何更新。 一旦主題狀態改變,主題就會通知所有注冊的觀察者,并且觀察者可以訪問更新后的狀態并采取相應的行動。 ![Observer Pattern Sequence Diagram](https://img.kancloud.cn/66/5a/665a38f848976dda97889c6945e5b076_633x309.png) 觀察者模式時序圖 ## 2.觀察者模式的真實示例 * 觀察者模式的真實示例可以是任何社交媒體平臺,例如 Facebook 或 Twitter。 當某人更新其狀態時,所有關注者都會收到通知。 關注者可以在任何時間跟隨或取消關注另一個人。 一旦取消關注,該人將來就不會收到該主題的通知。 * 在編程中,觀察者模式是面向消息的應用的基礎。 應用更新后,其狀態會通知訂閱者有關更新的信息。 像 [HornetQ](https://howtodoinjava.com/hornetq/basic-jms-messaging-example-using-hornetq-stand-alone-server/) , [JMS](https://howtodoinjava.com/jms/jms-java-message-service-tutorial/) 之類的框架都在此模式下工作。 * 同樣,基于 Java UI 的編程,所有鍵盤和鼠標事件均由其監聽器對象和指定的函數處理。 當用戶單擊鼠標時,預訂鼠標單擊事件的函數將作為方法參數傳遞給它的所有上下文數據被調用。 ## 3.觀察者設計模式 #### 3.1 架構 ![Observer Pattern Architecture](https://img.kancloud.cn/f3/0f/f30faeb204be89da5b0615a49daaa927_597x335.png) 觀察者模式架構 #### 3.2 設計參與者 觀察者模式有四個參與者。 * **`Subject`** – [接口或抽象類](https://howtodoinjava.com/oops/exploring-interfaces-and-abstract-classes-in-java/)定義了將觀察者附加到主題或從主題上拆下的操作。 * **`ConcreteSubject`** - 具體的`Subject`類。 它維護對象的狀態,并在狀態發生變化時通知附加的觀察者。 * **`Observer`** – 定義用于通知此對象的操作的接口或抽象類。 * **`ConcreteObserver`** – 具體的`Observer`實現。 ## 4.觀察者設計模式示例 在下面的示例中,我將創建類型為`Subject`的消息發布者和類型為`Observer`的三個訂閱者。 發布者將定期將消息發布給所有訂閱或附加的觀察者,他們會將更新后的消息打印到控制臺。 **主題和具體主題** ```java public interface Subject { public void attach(Observer o); public void detach(Observer o); public void notifyUpdate(Message m); } ``` ```java import java.util.ArrayList; import java.util.List; public class MessagePublisher implements Subject { private List<Observer> observers = new ArrayList<>(); @Override public void attach(Observer o) { observers.add(o); } @Override public void detach(Observer o) { observers.remove(o); } @Override public void notifyUpdate(Message m) { for(Observer o: observers) { o.update(m); } } } ``` **觀察者和具體觀察者** ```java public interface Observer { public void update(Message m); } ``` ```java public class MessageSubscriberOne implements Observer { @Override public void update(Message m) { System.out.println("MessageSubscriberOne :: " + m.getMessageContent()); } } ``` ```java public class MessageSubscriberTwo implements Observer { @Override public void update(Message m) { System.out.println("MessageSubscriberTwo :: " + m.getMessageContent()); } } ``` ```java public class MessageSubscriberThree implements Observer { @Override public void update(Message m) { System.out.println("MessageSubscriberThree :: " + m.getMessageContent()); } } ``` **狀態對象** 該對象必須是[不變的](https://howtodoinjava.com/java/basics/how-to-make-a-java-class-immutable/)對象,這樣任何類都不能錯誤地修改其內容。 ```java public class Message { final String messageContent; public Message (String m) { this.messageContent = m; } public String getMessageContent() { return messageContent; } } ``` 現在測試發布者和訂閱者之間的通信。 ```java public class Main { public static void main(String[] args) { MessageSubscriberOne s1 = new MessageSubscriberOne(); MessageSubscriberTwo s2 = new MessageSubscriberTwo(); MessageSubscriberThree s3 = new MessageSubscriberThree(); MessagePublisher p = new MessagePublisher(); p.attach(s1); p.attach(s2); p.notifyUpdate(new Message("First Message")); //s1 and s2 will receive the update p.detach(s1); p.attach(s3); p.notifyUpdate(new Message("Second Message")); //s2 and s3 will receive the update } } ``` 程序輸出。 ```java MessageSubscriberOne :: First Message MessageSubscriberTwo :: First Message MessageSubscriberTwo :: Second Message MessageSubscriberThree :: Second Message ``` ## 5.常見問題 * **不同類型的觀察者可以注冊一個主題嗎?** 觀察者的性質和功能可以有所不同,但它們都必須實現一個通用的`Observer`接口,主題支持該接口注冊和注銷。 * **我可以在運行時添加或刪除觀察者嗎?** 是。 我們可以在任何時間添加或刪除觀察者。 * **觀察者模式和責任鏈模式之間的區別?** 在觀察者模式中,所有已注冊的處理器對象都同時獲得通知,并且它們同時處理更新。 但是在責任鏈模式中,鏈中的處理器對象是一個接一個地通知的,此過程一直持續到一個對象完全處理了通知為止。 * **觀察者模式的好處?** 主題和觀察者構成一個松散耦合的系統。 他們不需要明確地彼此了解。 我們可以隨時獨立添加或刪除觀察者。 相關的 Java 類: [`Observer` Java 文檔](https://docs.oracle.com/javase/10/docs/api/java/util/Observer.html) [`Observable` Java 文檔](https://docs.oracle.com/javase/10/docs/api/java/util/Observable.html)
                  <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>

                              哎呀哎呀视频在线观看