解讀asp.net中的觀察者模式_.Net教程
推薦:解讀Asp.net教程:設(shè)計(jì)IP地址屏蔽功能出于安全考慮,幾乎每個(gè)動(dòng)態(tài)網(wǎng)站都具備IP地址屏蔽功能,而網(wǎng)上流傳的很多關(guān)于該功能的教程大都采用字符串保存和驗(yàn)證IP地址,我認(rèn)為這是不太科學(xué)的,我試圖找到最佳的設(shè)計(jì)方案。 “I
在asp.net中實(shí)現(xiàn)觀察者模式?難道asp.net中的觀察者模式有什么特別么?嗯,基于Http協(xié)議的Application難免有些健忘,我是這樣實(shí)現(xiàn)的,不知道有沒(méi)有更好的辦法?
先談?wù)勑枨蟀桑悦庀萑肟照?
最近一個(gè)Case, 這樣的需求:很多客戶端不斷的向Web Application提交數(shù)據(jù),管理員進(jìn)入Web的管理頁(yè)面可以即時(shí)的看到這些數(shù)據(jù),有多個(gè)管理員可以同時(shí)瀏覽,且管理員瀏覽的數(shù)據(jù)從管理員開(kāi)始監(jiān)視那個(gè)時(shí)刻起,不能顯示以前的數(shù)據(jù)。從這個(gè)場(chǎng)景一看,明顯的觀察者模式,管理員開(kāi)始監(jiān)視時(shí),訂閱數(shù)據(jù),數(shù)據(jù)到達(dá)的時(shí)候向所有訂閱了數(shù)據(jù)的管理員廣播數(shù)據(jù)。
需求如下圖:
有了發(fā)布者還需要訂閱者,我們實(shí)現(xiàn)管理員類(lèi),來(lái)訂閱數(shù)據(jù)
以下為引用的內(nèi)容: public class Admin { /**//// <summary> /// 用這個(gè)保存所有收到的數(shù)據(jù) /// </summary> public IList<string> MessageList { get; set; } public Admin(Monitor monitor) { MessageList = new List<string>(); monitor.DataIn = new EventHandler< DataEventArgs>(ReciveMessage); } [img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img] private void ReciveMessage(object sender, DataEventArgs e) [img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img] [img]http://www.cnblogs.com/Images/dot.gif[/img]{ [img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img] MessageList.Add(e.Message); [img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img] } [img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img] } [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] |
Ok,需要具備的元素我們都寫(xiě)好了,但是如何讓它們工作起來(lái)?如果使Winform程序,那將毫無(wú)懸念。
分析:我們碰到的問(wèn)題
第一個(gè)問(wèn)題:當(dāng)客戶端發(fā)送一個(gè)數(shù)據(jù)包,我們是實(shí)例化一個(gè)新的Monitor么?如果是,哪么每次實(shí)例化一個(gè)全新的Monitor,所有在它上面訂閱的事件將全部消失了,如果不是那這個(gè)Monitor將如何存在呢?總不能真空吧,兩個(gè)http請(qǐng)求之間如何保存數(shù)據(jù)呢?不過(guò)再把需求一讀,好像整個(gè)應(yīng)用程序中就只需要也只能有一個(gè)這樣的Monitor呢,該是單件模式上場(chǎng)的時(shí)候了。
在上面的Monitor的實(shí)現(xiàn)中添加下面的代碼:
以下為引用的內(nèi)容: [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] private static Monitor _instance = null; [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img]public static Monitor Current [img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif[/img] [img]http://www.cnblogs.com/Images/dot.gif[/img]{ [img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img] get [img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img] [img]http://www.cnblogs.com/Images/dot.gif[/img]{ [img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img] if (_instance == null) [img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img] _instance = new Monitor(); [img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img] return _instance; [img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img] } [img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img]} |
但是本系統(tǒng)存在多個(gè)客戶端,所以為了避免多線程造成問(wèn)題,還是來(lái)Double Check一下吧,修改上面的代碼如下:
以下為引用的內(nèi)容: [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] public static Monitor Current [img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif[/img] [img]http://www.cnblogs.com/Images/dot.gif[/img]{ [img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img] get [img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img] [img]http://www.cnblogs.com/Images/dot.gif[/img]{ [img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img] object o = new object(); [img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img] if (_instance == null) [img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img] [img]http://www.cnblogs.com/Images/dot.gif[/img]{ [img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img] lock (o) [img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img] [img]http://www.cnblogs.com/Images/dot.gif[/img]{ [img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img] if (_instance == null) [img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img] _instance = new Monitor(); [img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img] } [img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img] } [img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img] return _instance; [img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img] } [img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img] } [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] |
(PS:為什么使用單件就可以跨請(qǐng)求保存實(shí)例了呢?因?yàn)檫@里使用了一個(gè)static member保存Monitor的引用,static member在.net的GC里面是被作為Root的,詳細(xì)內(nèi)容請(qǐng)參見(jiàn)框架程序設(shè)計(jì)那本書(shū))
分享:.Net教程之HTTP狀態(tài)碼200,301,302跳轉(zhuǎn)非常常用,在哪里都一樣,這里的一些說(shuō)明和用法也如此,不止適用于asp.net,其他語(yǔ)言也會(huì)用得到。跳轉(zhuǎn)的目的本來(lái)很簡(jiǎn)單,就是當(dāng)用戶或系統(tǒng)需要時(shí)從一個(gè)頁(yè)面轉(zhuǎn)向另一個(gè)頁(yè)面,但自從有了
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實(shí)例(可帶附件)
- js實(shí)現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實(shí)現(xiàn)
- Asp.Net 無(wú)刷新文件上傳并顯示進(jìn)度條的實(shí)現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見(jiàn)代碼存在的偽造IP問(wèn)題探討
- VS2010 水晶報(bào)表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(kù)(連接字符串的配置及獲取)
- asp.net頁(yè)面?zhèn)髦禍y(cè)試實(shí)例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲(chǔ)過(guò)程實(shí)現(xiàn)分頁(yè)示例代碼
- 相關(guān)鏈接:
- 教程說(shuō)明:
.Net教程-解讀asp.net中的觀察者模式。