<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國際加速解決方案。 廣告
                # Java 觀察者設計模式示例 > 原文: [https://javatutorial.net/java-observer-design-pattern-example](https://javatutorial.net/java-observer-design-pattern-example) **觀察者模式**是一種軟件設計模式,其中一個稱為主題的對象維護著一個依賴于它的所有其他對象(主題)的列表。 這些依賴者稱為觀察者。 如果主題(所有受撫養者(觀察者)的維護者)的狀態發生變化,則會自動通知他們。 它通常通過方法調用來完成。 ## 何時使用觀察者模式 * 通常在對象之間存在一對多關系時使用。 * 如果一個對象(另一個**相關**)修改/更改了其“行為”,則需要更新該對象。 * 當主題的觀察者數量未知時。 ## 怎么運行的 通常,會有一個`Subject.java`文件,其中包含執行所有觀察者的添加,刪除和更新的所有方法,或者僅初始化它們,并在不同的`.java`文件中執行所有方法的功能。 按照約定,還有一個`Observer.java`文件,該文件包含一個每次主題更改時都會調用的`update()`方法。 之后,您必須創建實現`Subject`類或`Observer`類的`.java`文件。 請注意,這取決于您的類是應實現`Subject`還是`Observer`類文件。 ![Observer design pattern](https://img.kancloud.cn/05/e2/05e2eb1140ef0573d62a0f90a654ffce_536x320.jpg) 觀察者設計模式 ## 現實生活中的例子 想想您最喜歡的會員服務。 也許是體育館,或者是 Netflix,或者完全不同。 在本示例中,我們將使用 Netflix,但基本上任何其他成員資格服務都可以使用。 如果 Netflix 更改了其每月會員資格的價格,而您要為此付費,則它應通知您。 實際上,它應該通知所有注冊/訂閱人員服務。 ## Java 觀察者設計模式示例 `Subject.java` ```java public interface Subject { public double getCurrentPrice(); public void setNewPrice(double newPrice); public void addNewSubscriber(Observer newSuObserver); public void removeSubscriber(Observer unsubscriber); public void notifyAllSubscribers(); } ``` 在`Subject.java`中,我們將初始化將在`SubscriptionGrabber.java`文件中使用的方法,我將在稍后向您介紹。 這些方法處理添加,刪除以及主題狀態更改時觸發的消息。 `Observer.java` ```java public interface Observer { public void update(double price); } ``` 這是我們的`Observer`類。 它具有將在類`SubscriptionObserver.java`文件中創建的`update(double price)`方法。 請**注意**:每次訂閱價格更改時,都會調用此方法。 `SubscriptionGrabber.java` ```java import java.util.*; public class SubscriptionGrabber implements Subject { private List<Observer> subscribers = new ArrayList<Observer>(); private double price; public SubscriptionGrabber() { subscribers = new ArrayList<Observer>(); } public double getCurrentPrice() { return price; } public void setNewPrice(double newPrice) { this.price = newPrice; notifyAllSubscribers(); } public void addNewSubscriber(Observer newSubscriber) { subscribers.add(newSubscriber); } public void removeSubscriber(Observer unsubscriber) { int indexOfUnsubscriber = subscribers.indexOf(unsubscriber); subscribers.remove(indexOfUnsubscriber); } public void notifyAllSubscribers() { for (Observer subscriber : subscribers){ subscriber.update(price); } } } ``` 此`.java`文件使用`Subject`接口。 請注意,在`setNewPrice(double newPrice)`方法中,我們在設置新價格后會通知用戶。 重要的是,我們必須在價格變化后執行此操作,否則以后,如果其中有更多代碼塊,則可能會出現問題。 我們的`addSubscriber(Observer newSubscriber)`和`removeSubscriber(Observer subscriber)`只是在觀察者列表中添加人或從觀察者列表中刪除人。 我們需要在我們的模式中具有刪除功能,因為我們的目的是僅通知訂閱者,或者僅通知使用我們服務的人員。 我們無需通知不再使用我們服務的人員。 最后,此`.java`文件中的`final`方法僅對每個訂戶調用`update(double price)`方法(我們仍未創建)。 `SubscriptionObserver.java` ```java public class SubscriptionObserver implements Observer { private double price; private Subject subscriberGrabber; private int subscriptionID; public SubscriptionObserver(Subject subscriptionGrabber) { this.subscriberGrabber = subscriptionGrabber; this.subscriptionID+=1; subscriberGrabber.addNewSubscriber(this); System.out.println("New Observer: " + this.subscriptionID); } public void update(double price) { System.out.println("Price changed from $" + this.price + " to $" + price); this.price = price; } } ``` 這是實際上(最終)具有更新功能的`.java`文件。 請注意我是如何在其中放入打印語句的。 這非常重要(在`update`方法中包含打印語句),因為您需要直觀地顯示用戶所發生的事情。 在**構造函數**中,該參數始終是一個空列表(您將在下一個`.java`文件中看到),并且`subscriptionGrabber`將是我們的新列表,其中將包含訂閱者。 在第 9 行,您可以看到我們正在添加此新訂戶。 `ObserverPattern.java` ```java public class ObserverPattern { public static void main(String[] args) { SubscriptionGrabber subscriptionGrabber = new SubscriptionGrabber(); SubscriptionObserver subscriptionObserver = new SubscriptionObserver(subscriptionGrabber); SubscriptionObserver subscriptionObserver2 = new SubscriptionObserver(subscriptionGrabber); SubscriptionObserver subscriptionObserver3 = new SubscriptionObserver(subscriptionGrabber); subscriptionGrabber.setNewPrice(5); } } ``` 在這里我們創建抓取程序(列表),然后將該列表作為參數傳遞給訂閱觀察者變量作為構造函數參數。 然后,我們將訂閱的新價格設置為 5 美元。 預期結果將是通知所有用戶價格確實已更改為 5 美元。 試試吧! ![Java observer pattern result 1](https://img.kancloud.cn/49/d5/49d549b76ba5282ca737001054aa2632_328x48.jpg) Java 觀察者模式結果 1 它按預期工作。 現在,我們嘗試再創建 2 個訂閱,并查看消息是否會彈出 3 次(因為我們將有 3 個訂閱)。 ![Java observer pattern result 2](https://img.kancloud.cn/5d/8e/5d8e663bf0f446dac3b6945ae7c8d59f_430x96.jpg) Java 觀察者模式結果 2 它確實打印了三遍。
                  <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>

                              哎呀哎呀视频在线观看