zoukankan      html  css  js  c++  java
  • 观察者模式的变通

    观察者模式的变通

       昨天去面试,面试官提出一个问题,需求大概这样. 有几个监控设备,我们要监控这些数据保存到数据库,同时如果这些数据有异常的话,要及时通知相关人. 一开始我想到的是,做一个服务去扫那些数据,如果有异常,我们就发通知过去. 但给面试官否则了,它说那个通知要实时性的.所以我马上就想到,我们要在原始数据采取中下手,但当时现场也没有很好的模式出来,回来后,我就觉的用下面的设计去做,应该是比较完美的.这样可以极大对代码进行解耦. 请看类图:

     

         详细说明如下:

    1. 提取封装成一个接口,因为不同的设备可能 有不同的提取方式.然后我们接口的基础上实现一个抽象类,这样做目的,就是把给这个提取类的公共功能,写在这个抽象类里面.比如加载业务规则对象(这是个虚函数,主要功能是通过配置,决定要监控的那些业务.如果子类里有不同的加载方法,可以重写这函数),这是所有提取类都要有的. 提取类就实现提取数据接口就行了,提取完后调用监控函数,数据传到要监控的业务对象里面.
    2. 业务监控,跟提取类差不多,也是定义一个接口,然后实现一个抽象类,抽象类会作一些读取通知类型的配置.在具体的业务类里面,就定义一下业务规则,当达到某个业务规则的时候,就调用notice函数,给相关人发送通知.
    3. 通知也跟上面差不多.抽象类实现一些公关功能.具体类,实现具体的通知方式.
    4. 我们这个设计,最后我们就可以同过IOC的模式,实现整个设计是可插拔的.只要配置好相关的配置,就能实现你想要的功能.

     

    关于设计模式的一些总结:

     其实我们在设计的时候,并不是一定要遵守一些模式,我们设计的目的就是要实现,类的解偶,最好就实现拆拔式的设计,然后把相同的功能集中在一个地方写,同时要遵守相关的面相对象的设计原则,具体可参考我的博客.

     http://www.cnblogs.com/jake1/archive/2013/05/03/oop.html.

    只要我们遵守这些东西去做,那么我们的设计就会比较完美了.

    这上面的设计,其实我是有参考观察者模式,请看下图.

     

  • 相关阅读:
    ASP.NET Core 问题排查:Request.EnableRewind 后第一次读取不到 Request.Body
    解决 AutoMapper ProjectTo 不起作用的问题
    解决 ASP.NET Core 自定义错误页面对 Middleware 异常无效的问题
    ASP.NET Core 从 gitlab-ci 环境变量读取配置
    终于解决 xUnit.net 测试中无法输出到控制台的问题
    ASP.NET Core 新建线程中使用依赖注入的问题
    前端回顾:2016年 JavaScript 之星
    前端工程师和设计师必读文章推荐【系列三十五】
    AsciiMorph
    Notyf
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3068890.html
Copyright © 2011-2022 走看看