一个采取数据后的预警通知的设计----观察者模式的变通
昨天去面试,面试官提出一个问题,需求大概这样. 有几个监控设备,我们要监控这些数据保存到数据库,同时如果这些数据有异常的话,要及时通知相关人. 一开始我想到的是,做一个服务去扫那些数据,如果有异常,我们就发通知过去. 但给面试官否则了,它说那个通知要实时性的.所以我马上就想到,我们要在原始数据采取中下手,但当时现场也没有很好的模式出来,回来后,我就觉的用下面的设计去做,应该是比较完美的.这样可以极大对代码进行解耦. 请看类图:
详细说明如下:
- 提取封装成一个接口,因为不同的设备可能 有不同的提取方式.然后我们接口的基础上实现一个抽象类,这样做目的,就是把给这个提取类的公共功能,写在这个抽象类里面.比如加载业务规则对象(这是个虚函数,主要功能是通过配置,决定要监控的那些业务.如果子类里有不同的加载方法,可以重写这函数),这是所有提取类都要有的. 提取类就实现提取数据接口就行了,提取完后调用监控函数,数据传到要监控的业务对象里面.
- 业务监控,跟提取类差不多,也是定义一个接口,然后实现一个抽象类,抽象类会作一些读取通知类型的配置.在具体的业务类里面,就定义一下业务规则,当达到某个业务规则的时候,就调用notice函数,给相关人发送通知.
- 通知也跟上面差不多.抽象类实现一些公关功能.具体类,实现具体的通知方式.
- 我们这个设计,最后我们就可以同过IOC的模式,实现整个设计是可插拔的.只要配置好相关的配置,就能实现你想要的功能.
关于设计模式的一些总结:
其实我们在设计的时候,并不是一定要遵守一些模式,我们设计的目的就是要实现,类的解偶,最好就实现拆拔式的设计,然后把相同的功能集中在一个地方写,同时要遵守相关的面相对象的设计原则,具体可参考我的博客.
http://www.cnblogs.com/jake1/archive/2013/05/03/oop.html.
只要我们遵守这些东西去做,那么我们的设计就会比较完美了.
这上面的设计,其实我是有参考观察者模式,请看下图.