C 觀察者模式

2021-08-30 11:46:58 字數 1352 閱讀 5703

下面**是使用c#實現觀察者模式的例子: 

//「觀察者」介面

public inte***ce iobserver

//「被觀察物件」介面

public inte***ce iobservable

觀察者和被觀察物件都分別從這兩個介面實現,所有的操作都是由這兩個介面定義的,而不是具體的實現。所以觀察者和被觀察物件沒有繫結在一起。我們可以方便的更改觀察者和被觀察物件的任意部分而不影響其他部分。

下面實現具體的被觀察物件。下面的類是所有被觀察物件的基類,實現了所有被觀察物件都必須的方法。我們使用乙個hashtable作為觀察者的容器。**如下:

//所有被觀察物件的基類

public class observableimpl : iobservable

//撤銷註冊

public void unregister(iobserver anobserver)

//將事件通知觀察者

public void notifyobservers(object anobject)

} } 上面的類不是最終要實現的被觀察物件,而是所有被觀察者的基類,其中實現了所有觀察物件共有的功能。這個類可以乾脆定義為abstract,使得程式設計師不可以建立其實例。介面以及實現這個介面的虛類既保持了類之間鬆散的耦合,又使多個具體實現可以使用相同的功能。

下面最終實現觀察者模式,使用使用者介面——業務資料作為例子:

//業務資料(被觀察物件)

public class somedata : observableimpl

} } //使用者介面(觀察者)

public class somekindofui : iobserver }

//實際呼叫的過程

public class mainclass }

.net中更好的實現方式

上面的形式是我們用一種最基本的方式實現了觀察者模式,我們為觀察者模式開發了一種特定的型別。在.net框架中,使用**以及事件,可以更好的實現觀察者模式。c#中**和事件的介紹可以看這一篇文章:在c#中使用**的方式觸發事件,裡面有對**和事件的詳細描述,還有例程,這裡就不多說了。在.net支援的其他語言中也有各自的實現方式。

在事件的模式下,宣告事件的類就是被觀察者。被觀察者不需要實現對觀察者的註冊,只需要公開乙個事件,而不實行任何操作。被觀察者也不需要將自己註冊到觀察物件中,而是要建立乙個特定的**的例項,將這個**繫結到某個方法上。用這樣的方式註冊或者撤銷觀察者對觀察物件的觀察。仔細研究**和事件的模式就不難發現,iobserver和iobservable介面的方法可以減少觀察者和觀察物件之間的耦合,而**和事件幾乎消除了這兩個模組之間的耦合,靈活性提高了很多。

C 觀察者模式

觀察者模式 有時被稱作發布 訂閱模式,觀察者模式定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某乙個主題物件。這個主題物件在狀態發生變化時,會通知所有觀察者物件,使它們能夠自動更新自己。作用 在大的專案中,當乙個物件的狀態發生改變時可以通知其他相關的物件,這就可以用到觀察者模式。用以將多種物件...

觀察者模式C

當物件間存在一對多的關係,當狀態改變時,其他物件都得到通知,這就是觀察者模式了。觀察者模式實現發布 訂閱功能。如我們有個專案叫ngi,需要召開stanup會議,會議上需求變更時需要通過所有參加會議的人員,我們就可以使用觀察者模式,其uml圖如下 其 實現如下 include include incl...

觀察者模式 C

儲存所有的觀察者物件的引用 並可以增加和刪除觀察者 abstract class handleobserver public void removeobserver observer observer public void notify 為具體的觀察者定義乙個介面 得到通知時更新 abstract...