您当前的位置: 首页 > 生活

站长aspnet狆嘚观察者模式7z

2019-01-31 03:51:45

16:28 来源:blogs :Googler【纠错】人评论

A-A+ 怎么开淘宝店 站优化方法 创业如何获得投资 小米note顶配版评测 LOL活动

在asp中实现观察者模式?难道asp中的观察者模式有什么特别么?嗯,基于Http协议的Application难免有些健忘,我是这样实现的,不知道有没有更好的办法?

先谈谈需求吧,以免陷入空谈

近一个Case, 这样的需求:很多客户端不断的向Web Application提交数据,管理员进入Web的管理页面可以即时的看到这些数据,有多个管理员可以同时浏览,且管理员浏览的数据从管理员开始监视那个时刻起,不能显示以前的数据。从这个场景一看,明显的观察者模式,管理员开始监视时,订阅数据,数据到达的时候向所有订阅了数据的管理员广播数据。

需求如下图:

有了发布者还需要订阅者,我们实现管理员类,来订阅数据

以下为引用的内容:public class Admin { /**//// summary /// 用这个保存所有收到的数据 /// /summary public IListstring MessageList { get; set; } public Admin(Monitor monitor) { MessageList = new Liststring(); taIn += new EventHandler DataEventArgs(ReciveMessage); }[img]://blogs/Images/OutliningIndicators/f[/img][img]://blogs/Images/OutliningIndicators/f[/img] private void ReciveMessage(object sender DataEventArgs e)[img]://blogs/Images/OutliningIndicators/f[/img][img]://blogs/Images/OutliningIndicators/f[/img][img]://blogs/Images/f[/img]{[img]://blogs/Images/OutliningIndicators/f[/img] d(ssage);[img]://blogs/Images/OutliningIndicators/f[/img] }[img]://blogs/Images/OutliningIndicators/f[/img] }[img]://blogs/Images/OutliningIndicators/f[/img]

Ok,需要具备的元素我们都写好了,但是如何让它们工作起来?如果使Winform程序,那将毫无悬念。

分析:我们碰到的问题

个问题:当客户端发送一个数据包,我们是实例化一个新的Monitor么?如果是,那么每次实例化一个全新的Monitor,所有在它上面订阅的事件将全部消失了,如果不是那这个Monitor将如何存在呢?总不能真空吧,两个请求之间如何保存数据呢?不过再把需求一读,好像整个应用程序中就只需要也只能有一个这样的Monitor呢,该是单件模式上场的时候了。

在上面的Monitor的实现中添加下面的代码:

以下为引用的内容:[img]://blogs/Images/OutliningIndicators/f[/img]private static Monitor _instance = null;[img]://blogs/Images/OutliningIndicators/f[/img]public static Monitor Current[img]://blogs/Images/OutliningIndicators/f[/img][img]://blogs/Images/OutliningIndicators/f[/img][img]://blogs/Images/f[/img]{[img]://blogs/Images/OutliningIndicators/f[/img] get [img]://blogs/Images/OutliningIndicators/f[/img][img]://blogs/Images/OutliningIndicators/f[/img] [img]://blogs/Images/f[/img]{[img]://blogs/Images/OutliningIndicators/f[/img] if (_instance == null)[img]://blogs/Images/OutliningIndicators/f[/img] _instance = new Monitor();[img]://blogs/Images/OutliningIndicators/f[/img] return _instance;[img]://blogs/Images/OutliningIndicators/f[/img] }[img]://blogs/Images/OutliningIndicators/f[/img]}

但是本系统存在多个客户端,所以为了避免多线程造成问题,还是来Double Check一下吧,修改上面的代码如下:

以下为引用的内容:[img]://blogs/Images/OutliningIndicators/f[/img]public static Monitor Current[img]://blogs/Images/OutliningIndicators/f[/img][img]://blogs/Images/OutliningIndicators/f[/img] [img]://blogs/Images/f[/img]{[img]://blogs/Images/OutliningIndicators/f[/img] get [img]://blogs/Images/OutliningIndicators/f[/img][img]://blogs/Images/OutliningIndicators/f[/img] [img]://blogs/Images/f[/img]{[img]://blogs/Images/OutliningIndicators/f[/img] object o = new object();[img]://blogs/Images/OutliningIndicators/f[/img] if (_instance == null)[img]://blogs/Images/OutliningIndicators/f[/img][img]://blogs/Images/OutliningIndicators/f[/img] [img]://blogs/Images/f[/img]{[img]://blogs/Images/OutliningIndicators/f[/img] lock (o)[img]://blogs/Images/OutliningIndicators/f[/img][img]://blogs/Images/OutliningIndicatgIndicators/f[/img] _instance = new Monitor();[img]://blogs/Images/OutliningIndicators/f[/img] }[img]://blogs/Images/OutliningIndicators/f[/img] }[img]://blogs/Images/OutliningIndicators/f[/img] return _instance;[img]://blogs/Images/OutliningIndicators/f[/img] }[img]://blogs/Images/OutliningIndicators/f[/img] }[img]://blogs/Images/OutliningIndicators/f[/img]

(PS:为什么使用单件就可以跨请求保存实例了呢?因为这里使用了一个static member保存Monitor的引用,static member在的GC里面是被作为Root的,详细内容请参见框架程序设计那本书)

1 2 3 下一页 查看全文

南京软磁批发厂家
纹铝窗花公司
PVD镀膜批发价格
推荐阅读
图文聚焦