觀察者模式(推模型 拉模型)

2021-09-28 12:41:06 字數 2799 閱讀 7131

觀察者模式(observer pattern):當乙個物件被修改時,會自動通知它的依賴物件

現在我們是新聞社,要向所有新聞訂閱者推送新聞。那麼該如何實現呢?

經過思考我們不難發現一家新聞社一般對應的是多個新聞訂閱者。

那麼我們先從新聞社開始入手,想一想新聞社要具備哪些基本功能呢?

1.新聞,2.有哪些訂閱者,3.新增訂閱者,4.取消訂閱者,5推送新聞。

//新聞社

public class news*****

public void removesubscriber(subscriber subscriber)

public void sendnews()

} public string getnews()

public void setnews(string news)

}

新聞社已經規劃好,現在考慮訂閱者,訂閱者是多個,那麼我們先定義一套訂閱者的標準(介面),並考慮訂閱者需要做的事:

1.接收新聞

//訂閱者

public inte***ce subscriber

標準寫好了,現在有兩個客戶聯絡上我們,要成為我們的訂閱者:

//訂閱者one

public class subscriberone implements subscriber

}//訂閱者two

public class subscribertwo implements subscriber

}

規劃了新聞社,與訂閱者籤了合同,現在來實際操作一下:

public static void main(string args)
觀察者模式(推模型),執行結果:

訂閱者one,接收到新聞:70周年

訂閱者two,接收到新聞:70周年

不難發現,這個設定新聞和傳送新聞,其實可以整合一下,第一種直接傳送新聞內容就行,第二種設定新聞時,自動推送給所有訂閱者,但是都還屬於推模型,先來實現第一種,改造新聞社:

//新聞社

public class news*****

public void removesubscriber(subscriber subscriber)

public void sendnews(string news) }

}

重新執行下:

public static void main(string args)
結果一致:

訂閱者one,接收到新聞:70周年

訂閱者two,接收到新聞:70周年

現在來實現第二種,改造新聞社:

//新聞社

public class news*****

public void removesubscriber(subscriber subscriber)

public void sendnews()

} public string getnews()

public void setnews(string news)

}

重新執行一下:

public static void main(string args)
執行結果一致:

訂閱者one,接收到新聞:70周年

訂閱者two,接收到新聞:70周年

以上是推模型的實現方法,那什麼是拉模型呢?先看這兩個地方:

新聞社推送的都是新聞,並且訂閱者訂閱的是新聞的內容。我們是否可以不推新聞,而是把新聞社提供給訂閱者,需要時訂閱者自己去獲取新聞呢?下面重新改造一下:

//新聞社

public class news*****

public void removesubscriber(subscriber subscriber)

public void sendnews*****()

} public string getnews()

public void setnews(string news)

}//訂閱者定義

public inte***ce subscriber

//訂閱者one

public class subscriberone implements subscriber

}//訂閱者two

public class subscribertwo implements subscriber

}

拉模型已經寫好,現在執行一下:

public static void main(string args)
執行結果

訂閱者one,接收到新聞:70周年

訂閱者two,接收到新聞:70周年

推拉模式與觀察者模式

最近做乙個訊息系統,其中涉及到新訊息數的即時更新,當時就想到了觀察者模式,後來聽同事提到推拉模式,感覺推模式原理上應該還是屬於觀察者模式,只不過把server變成了被觀察物件,client被動觀察 其實推拉模式我們經常遇到,如廣播 推 http請求 拉 只是沒有刻意去追求概念。設計時還是應該多考慮到...

行為型模型 觀察者模式

subject 被觀察者 被觀察的物件。當需要被觀察的狀態發生變化時,需要通知佇列中所有觀察者物件。subject需要維持 新增,刪除,通知 乙個觀察者物件的佇列列表。concretesubject 被觀察者的具體實現。包含一些基本的屬性狀態及其他操作。observer 觀察者 介面或抽象類。當su...

設計模式學習(八) 觀察者模式 1(拉模式)

2019年4月10日 觀察者模式 在物件之間定義了一對多的依賴,這樣一來,當乙個物件改變狀態,依賴它的物件會收到通知並自動更新。其實就是發布訂閱模式,發布者發布資訊,訂閱者獲取資訊,訂閱了就能收到資訊,沒訂閱就收不到資訊。推 push 模式是一種基於客戶器 伺服器機制,由伺服器主動將資訊送到客戶器的...