在實際專案中使用觀察者模式 前篇 委託和事件

2022-02-22 14:02:47 字數 1889 閱讀 9189

我們公司面試初級c#的筆試題有一道題目:「請用**實現:狗叫,主人被驚醒,貓跑了」。

這是一道很典型的可以使用觀察者模式來解答的題目,可惜來做題的夥伴經常沒有答上,今天我就從這道小題目開始,由淺到深講講觀察者模式。

但是在講觀察者模式之前我們先要了解委託和事件。

委託和事件

委託(delegate)本質上是函式指標(在js裡是函式變數的引用,js裡並不需要宣告delegate)。通俗來理解就是把一件事交給別人去做。

在**裡,「事情」就是functioin或method。delegate的作用就是把functioin或method裝起來,不在new的地方執行,而在別的地方執行。

delegate需要把要執行的method註冊進去,即告訴被委託人你要委託給他的事。

知道了委託,我們可以先試試水,用它來實現最開始說的筆試題的第一版。這裡大家先不用去想為什麼要這樣做。

首先定義三位演員和他們要做的事:

public

class

dog

}public

class

master

}public

class

cat

}

其次,我們把三位演員new出來,並把他們要做的事放入委託,最後通過「中介人」來執行委託:

public

delegate

void

thetestdelegate();

//定義乙個中間人來執行委託,需要接收乙個委託引數

private

static

void

agent(thetestdelegate dosomething)

static

void main(string

args)

這樣一來,中間人就把我們剛剛委託給他的事都給辦了

這樣寫的好處是顯而易見的。委託將main和各位演員的操作隔離了。每次執行委託時,我並不需要知道各位演員即將要做什麼騷操作(比如狗突然喵喵叫)。從而達到了解耦的效果。

知道了什麼是委託和委託怎麼用之後,接下來我們看看什麼是事件:

事件(event)是一種封裝了的委託,他做了什麼封裝,為什麼要這麼封裝呢?我們來繼續研究上面的例子。

在上面的**裡,委託被定義成了公共的變數。這樣就意味著誰都可以修改,那顯然不行。

所以我們要讓中介人自己管理他的委託合同。只有僱傭(new)他的人,才可以委託他幹活。而作為發布人的我們僅需要發布委託和觸發執行事件。

首先我們把agent單獨建乙個class,但是我們要怎麼讓中介人自己管理委託呢?即使把delegate移到agent裡,如果將delegate宣告為public,那照樣誰都可以賦值。若宣告為private,則誰都委託不了。

這時我們可以試試看用事件:

//

定義委託

public

delegate

void

thetestdelegate();

public

class

agent

}static

void main(string

args)

其實不然,為什麼這裡把method註冊進事件不需要也不能使用「=」號了呢?

其實宣告事件類似於把委託宣告成了屬性 (property)。我們的+=和-=相當於訪問了set訪問器,而真正的delegate其實被宣告成了private。

好了,搞了這麼久,前戲終於做完了。接下來可以開始說說觀察者模式了。

APP開發專案中的PHP觀察者設計模式

做專案過程中經常會遇到一種情況,寫乙個登陸介面,寫完後客戶有新需求需要增加統計登陸次數,過段時間又需要統計登陸地區,又過幾天又需要登陸推送活動或者新使用者獎勵,這種情況就容易讓 很雜亂,此時就可以用到觀察者模式。概念 觀察者,首先要有個被人觀察的角色,這是唯一的,然後有多個觀察者去看他,可以形容為一...

ios 使用觀察者模式

觀察者模式 在cocoa touch框架中,觀察者模式的具體應用有兩個 通知機制 notification 機制和kvo key value observing 機制 通知機制 通知機制和委託模式不同的是,前者是 一對多 的物件之間的通訊,後者是 一對一 的物件之間的通訊 通知主要有三種 廣播通知 ...

觀察者模式使用心得

觀察者模式作為 gof 24 個常見設計模式之一,在實際程式設計中應用非常廣泛,該設計模式的基本內容,可以參照 最近在使用觀察者模式的過程中,遇到兩個非常棘手的問題 1 對於目標的更新,導致觀察者多次更新的問題。2 若目標為指標,觀察者 attach 目標後,目標指標被刪除,導致觀察者與目標 det...