.NET初学者架构设计指南(三)设计模式
[2] .NET初学者架构设计指南(三)设计模式
[3] .NET初学者架构设计指南(三)设计模式
[4] .NET初学者架构设计指南(三)设计模式
[5] .NET初学者架构设计指南(三)设计模式
系列文章导航:
.NET初学者架构设计指南(一)Hello world的时代
.NET初学者架构设计指南(四)Model-View-Controller
我们可以设计一个类,叫做销售单位(SaleUnit)。这个类是他本身的一个聚合,可以通过一个集合成员访问到他下属的单位。并且他的每一种下属单元也是SaleUnit的子类。各种销售网点统计数据的方式是不同的:有的数据保存在数据库表里面,经过一些统计运算可以得到;有的直接放在数据表的某个字段里面,直接查出来就可以了;还有的是每天发过来的一个Excel电子表格。对于每一种不同的销售网点,都可以使用一致的接口对他们进行访问,得到需要的数据。
组合模式可以很精确的反映销售网点间的聚合关系,并且对查询和统计提供了非常一致的接口,调用者不必区分具体的网点类型。类似这样的情况,当我们发现需求中一些对象具有聚合关系,并且我们希望对他们做一些共同的事情,就可以采用组合模式。
现在产生了一个严重的问题:是的,调用一个对象的确实没有必要去区分具体的网点类型了,但是他们是在哪里被创建的呢,创建的时候还是要区分网点的类型,复杂的代码只是从一个地方转移到另一个地方罢了,这样做有什么好处呢?为了解释这个疑问,下面会介绍另一个常见的模式:工厂模式(Factory)。
工厂模式用来彻底的断绝调用者和被调用的具体类型之间的关系,他使用一个工厂创建具体的类型,调用者从工厂中取得对象的实例。调用者既不需要知道对象是怎样被创建的,也不需要知道创建的是什么类型。下面通过一个例子说明一下工厂模式的用处。
这是一个电气设备监控系统,他的一个任务是从安装在各处的传感器上采集各种设备的运行数据,集中显示在监视器上。还可以在设备上定义告警条件,当采集到的数据满足告警条件的时候,向监控人员发出告警,监视器上显示告警标志。基本的情况是这样的:
一个设备上可以有多个信号,比如一个变压器,上面可以有电压、电流、冷却剂温度等各种信号,分别由不同的传感器采集。每个信号隔一段时间会采集到一个数据,有的数据是直接采集到的,另一些是根据多个信号的情况计算出来的(比如一个电网环路上有n个节点,我们已经知道了其中n-1个节点的电压,就可以计算出最后一个节点的电压),还有的数据是一个推测值(需要根据一些经验数据进行推测)。传感器采集到信号数据以后,程序要判断这个数据的值,有时还要结合其他的信号,判断是否满足告警的条件,发出告警。
数据采集是一项十分复杂的工作,需要监控的设备种类繁多,数据意义复杂,传感器的通信方式也不相同。好在用户已经建设了了一个综合采集系统,解决了设备的实时数据采集工作。综合采集系统与各种传感器进行通信,将采集到的实时数据不断的输入到一个数据表里面。下面就是这个表里面的一些数据:
有了这么一个系统,直接采集数据的问题算是解决了。但是不同的信号类型对这个数据的解释仍然是不同的,我们仍然要应付这个问题。粗略的划分一下,有下面三种信号:
1、模拟信号:从综合采集系统里面查到实时数据,然后加上一个单位(比如伏特、安培),就可以显示了;
2、状态信号:需要定义一个状态描述。比如一个开关,采集数据高于0的时候就是闭合,等于0的时候就是断开;
3、推测信号:一些信号的数据从综合采集系统里面是无法得到的,必须通过公式计算出来。计算出来数值之后,加上一个单位显示出来。
我们可以把信号的定义存储在数据库里面,数据如下: