在一个web系统中有这样的需求,一个页面需要对一个xml文件进行crud等操作,如何设计一个系统适合这样的需求呢?
最容易直接想到的是一个类完成节点的crud及io操作,但这违反了类的设计原则--类应当只有一个中心任务.
所以按功能来分我们必须要两个类:
一个类负责节点crud操作;// 简称crudclass
一个类负责节点的io操作;// 简称ioclass
这样基本可以了,再细分下去没有必要.
再来看第一个类,它是直接与一批业务代码打交道的,首先要求速度要快,如果把解析出来的dom放在类里,一则crudclass做了ioclass做的事,二再速度上也上不去,所以这里我把dom里面的节点对应成了一个链表,一个值和一个map,业务代码实际处理的就是这三个东西,他们不关心也不必要知道是否存储到了文件里,而且速度上得到了充分保证.
其次各个业务代码处理的是同一事务,这里再把crudclass做成单例(singleton)形式的,做成全静态也可以,但这种做法不太上台面.
ioclass是crudclass的持久化操作,他们之间实际是仓库管理员和物流调度间的关系,这种关系有以下三种实现方式:
1.在他们间实现观察者模式,由ioclass来观察crudclass,变化后写入文件.初看这种方式很好的完成了解偶,实际上ioclass还是需要知道crudclass的细节,否则无法更新,而且创建ioclass的过程比较麻烦,客观世界可没有这样的处理.所以说观察者处理当抛弃.
2.将ioclass作为crudclass的成员,这种方式避免了ioclass创建的不必要的复杂过程,而且crudclass知道ioclass的处理接口就行了,ioclass无需知道crudclass的任何部分,实现了有效解偶,其三符合现实世界,ioclass确实应该是crudclass的下级,只接受crudclass指派的任务而外界无须知道ioclass,完全不必知道.
3.将ioclass独立处理出来,与crudclass等做成jms异步通信方式或webservice通信方式,这个想法更oo,但是成本比较高,复杂度大,在大型系统可以考虑实现这种方案.
综合上面的意见,选择方案2是最适合的.
至此对一个xml文件进行crud操作的系统设计完成,再适当剥离一些通用代码形成实用类就差不多了,这里不再赘述.
还是那句老话,道法自然.程序实现可以有n种实现方式,我们应该选择最符合自然的一种.
闽公网安备 35060202000074号