解讀asp.net中的觀察者模式(3)_.Net教程
推薦:解讀Asp.net教程:設計IP地址屏蔽功能出于安全考慮,幾乎每個動態(tài)網(wǎng)站都具備IP地址屏蔽功能,而網(wǎng)上流傳的很多關于該功能的教程大都采用字符串保存和驗證IP地址,我認為這是不太科學的,我試圖找到最佳的設計方案。 “I
經(jīng)過一番思考后我還是回到我自己的Solution上,不過我又有了新的看法了。不是要將數(shù)據(jù)先緩存么?看看這個緩存,實際上她也是個觀察者,至于她執(zhí)行怎樣的緩存策略是她的事情,如是我又有了一個新類:
| 以下為引用的內(nèi)容: //這里的代碼接上篇Post using System; using System.Collections.Generic; using System.Text; namespace ForyourSoft.NetTraffic.Framework { public sealed class DataBase { private IList<string> _buffer = new List<string>(); private static DataBase _instance = null; public static void Subscribe() { if (_instance == null) _instance = new DataBase(Monitor.Current); } public DataBase(Monitor monitor) { monitor.OnMessage = new EventHandler<Monitor.MessageEventArgs>(monitor_OnMessage); } void monitor_OnMessage(object sender, Monitor.MessageEventArgs e) { _buffer.Add(e.Message); if (_buffer.Count >= Config.BufferSize) { //將數(shù)據(jù)添加到數(shù)據(jù)庫 } } } } |
PS:由于系統(tǒng)中我們只需要這樣唯一一個訂閱者,所以我將其實現(xiàn)為一個單件,在Application_Start的時候調用DataBase.Subscribe()。
現(xiàn)在系統(tǒng)是這樣的結構:
| 以下為引用的內(nèi)容: [img]http://images.cnblogs.com/cnblogs_com/yuyijq/aspnetpattrern2.jpg[/img] |
可以設想以后還會有更多的訂閱者。果然,昨天客戶要求在下一個版本中管理員分角色,各個角色看到的數(shù)據(jù)不同的,只有超級管理員才可以監(jiān)視所有數(shù)據(jù),OMG,呵呵,不過還好,我只需要添加幾個訂閱者就可以輕松搞定。
后記:也許是我的文章標題沒有起好,也許很多人得到模式恐懼癥,提到模式總是要來考察一下你的case,不是那種Enterprise級別的用了pattern就是過火了。其實這篇文章的內(nèi)容里沒有一點模式的氣息,只是用.net的Event實現(xiàn)觀察者模式的思想,我想如果合適,今天模式的投資,明天你會有收獲的。
在.net里面我們有事件(event),那就無需使用傳統(tǒng)的觀察者模式的模型了
那么我首先實現(xiàn)一個Monitor類,這個類用來接收客戶端傳遞來的數(shù)據(jù)并將數(shù)據(jù)廣播出去
| 以下為引用的內(nèi)容: [img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] public class DataEventArgs : EventArgs [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] public string Message [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]{get;set;} [img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img] public DataEventArgs(string message) [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] this.Message = 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] public class Monitor [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] public event EventHandler<DataEventArgs> DataIn; [img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img] private void SendData(string message) [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 (DataIn != 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] DataEventArgs e = new DataEventArgs(message); [img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img] DataIn(this, e); [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/ExpandedSubBlockStart.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img] /**//// <summary> [img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img] /// 這個方法被一個HttpHandler調用,客戶端向這個Handler發(fā)送數(shù)據(jù) [img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img] /// 數(shù)據(jù)處理后作為字符串傳遞給該方法,該方法然后將數(shù)據(jù)廣播出去 [img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img] /// </summary> [img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img] /// <param name="message">處理后的數(shù)據(jù)</param> [img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img] public void ReciveData(string message) [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] SendData(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] |
分享:.Net教程之HTTP狀態(tài)碼200,301,302跳轉非常常用,在哪里都一樣,這里的一些說明和用法也如此,不止適用于asp.net,其他語言也會用得到。跳轉的目的本來很簡單,就是當用戶或系統(tǒng)需要時從一個頁面轉向另一個頁面,但自從有了
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實例(可帶附件)
- js實現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實現(xiàn)
- Asp.Net 無刷新文件上傳并顯示進度條的實現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(連接字符串的配置及獲取)
- asp.net頁面?zhèn)髦禍y試實例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲過程實現(xiàn)分頁示例代碼
- 相關鏈接:
- 教程說明:
.Net教程-解讀asp.net中的觀察者模式(3)
。