簡體   English   中英

觀察者模式和有狀態的可觀察范式

[英]Observer pattern and stateful observable paradigm

在Android應用程序的開發過程中,我遇到了目前無法解決的設計難題。 如果有任何想法,解決方法或干凈的解決方案,我將不勝感激:)我將嘗試盡可能簡化它:

一切都始於一個通用的觀察者模式實現。 有一個主題會根據其公開方法的調用更改狀態; 並且有觀察者對這些變化做出相應的反應。 在這種情況下,主題是STATEFUL主題,這意味着它具有內部狀態控制器(一個int),該狀態控制器會像自動機一樣發生變化。 每次狀態更改時,它都會照常通知觀察者:

  • client-> subject.anyMethod()//將主題狀態更改為狀態X
  • subject-> notifyObservers(newState)//主題通知新狀態X
  • 觀察者-> subject.getData()//檢索數據

但是現在想想這種情況:

  • client-> subject.anyMethod()//將主題狀態更改為狀態X
  • subject-> notifyObservers(X)//主題FIRST通知瀑布
  • viewerA-> subject.anyMethod()//將主題更改為狀態Y
  • subject-> notifyObservers(Y)//啟動第二個通知瀑布

由於第二個瀑布,現在將要發生的是,下一個觀察者(假設觀察者B)將收到狀態為Y的通知(來自最后一個第二個瀑布),並據此采取行動,當第二個瀑布完成時, PC(程序計數器)將繼續執行第一個通知瀑布,並向觀察者B重新通知舊狀態X。這會產生兩個主要問題:首先,觀察者B以錯誤的順序收到新狀態的通知(第一個狀態Y,然后在狀態X時通知狀態X)。第二,也是最重要的,即使是以錯誤的順序被通知,當觀察者B收到新狀態X的通知時,由於主體真實狀態是Y,所以它完全錯誤。 這會產生很多問題。

正如您可能已經意識到的那樣,當觀察者提交主題狀態的更改時,會發生這種情況,而不是僅從主題中獲取數據。 我將不勝感激任何其他模式或解決方案。 另外還要澄清只有一個線程。

提前致謝。

您需要的是一種可以同步狀態傳播的信號燈。 subject傳播狀態改變它首先設置一個信號量,將鎖定的任何進一步狀態的變化(或簡單的狀態變化傳播) subject 這也可以通過subject的觀察者模式內部的堆棧來實現。 僅在通知所有客戶端狀態更改后,才能釋放信號量。 這樣,可以確保狀態更改的發送按其對subject執行的順序到達所有客戶端。

如果使用狀態機為上述模型建模,則將使用歷史記錄狀態機。

經過數小時的思考,我認為我找到了一個可能的解決方案,這與Thoms Kilian提出的建議有關。 關鍵是某種發布方法,該方法將那些更改主題狀態的方法排隊。 一種可能的實現方式是使用處理程序並將這些方法發布到主線程中(請記住不再有線程):

client -> subject.anyMethod() //changes subject state to state X
subject -> handler.post(anyMethod())
//nothing to do, so post is executed
subject -> notifyObservers(X) // subject FIRST notification waterfall
observerA -> subject.anyMethod() //changes subject to state Y
//here comes the change
subject -> handler.post(anyMethod())
//pc keeps sending rest of notifications before executing the posted runnable and the second waterfall

這樣,所有觀察者在更改時都將訪問相同的狀態,並將將來的事件排隊:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM