設計模式學習之訊息驅動機制

2021-06-18 16:19:57 字數 1524 閱讀 8080

訊息驅動機制,也叫觀察者模式、事件驅動模式。不論是在應用還是遊戲中,都是一種常見的設計模式,該設計模式非常利於模組的解耦。

我們這裡以老師和學生為例,有乙個老師和多個學生,老師發的每乙個訊息,學生都要能夠收到。如:老師說,明天我們放假,然後確保所有學生都能收到該訊息。

首先,建立乙個訊息分發中心,負責收集和移除訊息接收個體(這裡就是學生),同時負責通知到收集的每乙個個體。該類命名為human_event.

public abstract class human_event 

public void removemessage(listener msg)

public void notifylistener(string saysomething) }

}

然後,建立乙個老師類,該類具有訊息分發的特性,所以繼承自human_event

public class teacher extends human_event 

public void say(string saysomething)

}

ok,訊息中心就建立了。

然後,我們需要建立監聽者,這建立乙個介面類listener

public inte***ce listener
學生具有監聽者的特性,所以繼承自listener

public class student implements listener 

}

ok,訊息分發者和監聽者都建立好了 ,現在來實現邏輯。

public class client 

}

這裡將監聽者sut1 和stu2新增到事件中心,當老師say的時候,其他監聽者就能收到訊息啦。

上面這種訊息模式,對於學生來說,是一種被動接收的過程,需要等待老師的saysomething引數傳過來,其實我們這裡可以做乙個小小的變動,就可以變成主動拉取啦。

變動是這樣的,將傳給學生的物件不再是string,而是老師這個物件,如此,學生就可以取到老師的所有資訊了。

第一處修改,修改listener介面:

public inte***ce listener
第二處修改,修改訊息派發處human_event類的傳遞引數為自身,刪除notifylistener方法的引數:

public abstract class human_event   

public void removemessage(listener msg)

public void notifylistener()

} }

如此,將整個teacher物件傳給了student,student就可以根據自己的需要去取老師的資訊了。

但是,個人比較推薦前者,按需將引數傳遞過去就行了,將整個物件傳遞過去並進行強轉,對於受體來說,就可以毫無節制的獲取所有資訊了,可能造成進一步耦合。

事件驅動機制和訊息驅動機制

事件 按下滑鼠,按下鍵盤,按下遊戲手柄,將u盤插入usb介面,都將產生事件。比如說按下滑鼠左鍵,將產生滑鼠左鍵被按下的事件。訊息 當滑鼠被按下,產生了滑鼠按下事件,windows偵測到這一事件的發生,隨即發出滑鼠被按下的訊息到訊息佇列中,這訊息附帶了一系列相關的事件資訊,比如滑鼠哪個鍵被按了,在哪個...

詳解事件驅動跟訊息驅動機制相比

事件驅動和非同步io 通常,我們寫伺服器處理模型的程式時,有以下幾種模型 1 每收到乙個請求,建立乙個新的程序,來處理該請求 2 每收到乙個請求,建立乙個新的執行緒,來處理該請求 3 每收到乙個請求,放入乙個事件列表,讓主程序通過非阻塞i o方式來處理請求 上面的幾種方式,各有千秋,第 1 中方法,...

設計模式學習之策略模式 容錯恢復機制

容錯恢復機制 應用程式開發中常見的功能 程式執行的時候,正常情況下應該按某種方式來做,如果按照某種方式來做發生錯誤的話,系統並不會崩潰,而是繼續執行,能提供出錯後的備用方案。日誌記錄的例子 把日誌記錄到資料庫和日誌記錄到檔案當做兩種記錄日誌的策略 日誌記錄的策略介面 package com.cmc ...