如何使用go來實現觀察者模式

2021-10-04 11:26:05 字數 2003 閱讀 6577

總結最近在學習go語言,學習一門語言最好的方法,就是實踐啦,於是我心血來潮,有乙個大膽的想法,就是如何使用go這種非物件導向程式設計的語言來實現觀察者模式呢?於是便有了這片部落格,這裡不再詳細介紹觀察者模式,如果需要了解觀察者模式的話,請參考我之前的部落格觀察者模式。

首先,我們知道,觀察者模式是基於委託或者事件來實現的,但是,go並沒有像c#那樣,提供了委託這種內建型別,這個時候,我們就需要知道,c#的委託實際上是什麼呢?

其實c#委託的本質,就是用於儲存乙個或多個函式指標的一種型別。哦豁?,突然發現go是支援函式指標的,這樣的話我們就可以使用go中的函式指標,另外,委託是用來儲存乙個或多個函式指標的,對應著go的話,可以使用slice或者map來儲存。

接下來我們就可以模擬c#中的委託啦。??

首先,我們定義一下老闆和員工的struct.

type boss struct

type staff struct

這裡我用了map型別來模擬委託是因為,委託既可以+=也可以-=的,而map實現起來最為方便。

接下來定義兩個介面,乙個是notificator,乙個是observer

//訊息傳送者

type notificator inte***ce

//觀察者

type observer inte***ce

接著我們來實現這兩個介面,boss實現notificator介面,staff實現observer介面。

func

(b *boss)

attach

(name string

, handlefunc func()

) b.delegate[name]

= handlefunc

}func

(b *boss)

detach

(name string

)error

else

}func

(b *boss)

notify()

error

return

nil}

else

}func

(s *staff)

handle()

好了,接著我們就可以直接來看看效果如何了??

func

main()

s2 :=staff

boss := boss

boss.

attach

(s1.name,s1.handle)

boss.

attach

(s2.name, s2.handle)

err := boss.

notify()

if err !=

nil boss.

detach

(s1.name)

boss.

notify()

err = boss.

detach

(s1.name)

fmt.

println

(err)

}

jack is handling boss coming

tom is handling boss coming

tom is handling boss coming

handle function does not exist

嗯,這個結果很完美?

其實基礎很重要(這句話都聽爛掉了)。有了某個領域的底層基礎知識(原理),你會發現很多東西都是一樣的,只是表現不一樣而已,就好比生物,其底層的構造是dna或者rna(當然這不一定是最底層的),但表現形式有各種各樣的(高中生物中的生物多樣性??)。這裡強調的是底層基礎知識(原理),對於程式設計來說,就是資料結構、演算法、作業系統、程式語言的底層原理等等(都是一些聽著就禿頭的知識??)。

最後,我們一起學習這些底層基礎(禿頭?)知識吧。

寒江雪 Go實現觀察者模式

觀察者模式使得一種型別的例項可以傳送事件給其他型別,前提是接收事件的例項要根傳送者訂閱這個事件。先來定義要使用到的介面 package observer type event struct observer inte ce notifier inte ce 然後寫幾個簡單的型別實現這些介面 pack...

觀察者模式實現

公升級觀察者 var observer function 定義介面 return else trigger方法用於觸發觀察者物件中的事件 type 要觸發的事件名稱 trigger用於觸發觀察者物件中的事件 trigger function type,val off方法用於移除某個事件 off fu...

觀察者模式使用C 實現

1.請用觀察者模式實現如下應用場景 15分 夜裡有乙隻貓大叫了一聲,同處一屋的老鼠接受到了貓大叫的資訊,於是開始逃跑。同樣,主人聽到了,被吵醒了。要求 老鼠跟主人是被動的 要考慮聯動性與擴充套件性 評分標準 介面定義5分,介面實現5分,呼叫介面實現測試5分。本題滿分15分。參 using syste...