重构机房收费系统(二)

接上篇《机房收费系统重构(一)》


二、概要设计

完成了用例图,并用结合用例图完善了一下需求分析说明书,忘记是第几次修订需求分析说明书。有了用例图,很自然就进入了概要设计阶段。我认为这一阶段就是结合包图解决系统的基本架构。在这里采用了三层架构(符合高内聚,低耦合的思想),并结合了一些设计模式。

 

下面看我的包图:


可以看到,这个包图,是从最经典的三层UI-BLL-DAL加入设计模式演化而来。

之所以采用抽象工厂模式是考虑到更换数据库的方便。

而应用外观模式,是为了解决UI层和BLL层耦合性过高的问题,UI层不必知道BLL层的存在,Facade(外观)知道BLL层的哪些类负责处理哪些请求,它将UI的请求代理给适当的BLL层的类。使外部调用更方便。

 

三、抽象各层的类

当我们确定了整个系统的架构,接下来要做的就是细化,这是一个从宏观到微观的过程。

1、抽象实体类

我认为,第一步要做的就是抽象实体层的类(Entity),因为信息系统是对数据的操作和处理,首先必须要有数据,这个时候,我们要返回需求,了解用户的数据要求,以此为依据进行数据库设计,数据库设计参见我的文章:

《数据库设计第三范式》

还有一篇转载《数据库设计经验谈》

 

数据库设计好了,我们要根据数据库中的表抽象实体类,在机房收费系统中,实体类基本上是跟表一一对应的,一个表映射出一个实体类,表的字段即为实体类的属性。

 

实体层并不属于三层中的任何一层,它是独立出来的一层,可以把他看做自定义变量的组合,供三层使用。

 

下面看看我抽象出的实体类:

见图:



从图中,看到有一个EN_PublicField类,这个类并不是由数据表映射而来,它是一个装载公共变量的类,在系统中,尽量不要在类之外建立变量.有全局用的东西,我们可以建一个实体类,把该全局变量作为它的属性。所以,实体类的数量可能多余表的数量.

 

2、数据访问层

搞定了实体层,再来看看数据访问层(DAL),这一层的主要任务是直接操作数据库,完成对数据的增删改查等。这里我们仍然根据数据表来抽象DAL层的类,基本上也是一个表对应一个类,这样当我们增加新的表,直接增加新的DAL层类就可以,很好地符合了“开闭原则”。

另外,因为DAL层的类是直接对数据库进行操作的类,所以这个类里封转大都有四种方法:增删改查。但根据实际情况会有不同的参数,不同的返回值。

 

这里加了一层接口,利用反射和抽象工厂,以防更换数据库。见下面的部分截图。

 

接口:



注:我们看到有一个接口叫ITime,这个接口是用来获取服务器时间,所以DAL层类的数量也可能多余表的数量。


DAL实现IDAL接口


 

抽象工厂模式+反射+配置文件


3、封装业务逻辑,构成BLL层的类

完成了数据访问层,我们算是打好了地基了,下面我们再看用例图,基本上一个用例封装了一个功能。BLL层的类,我们可以根据功能来分,把与该功能相关的操作集成到一个BLL层的类里,这里我们要把握好粒度,平衡就好。

尽量做到符合单一职责原则,一个类完成一个功能,即不要在BLL层出现类之间互相调用的情况,虽然可以减少代码量,但会增加系统的复杂性,造成模块与模块之间的强耦合。

举个例子:“结账”的时候我们需要查询充值记录表,“查询充值记录”的时候我们也需要查询充值记录表,我们应该在BLL层的结账类里设置查询方法,在查询充值记录类里也应设置查询方法。

 

如果情况比较特殊,需要交叉调用,例如一个操作需要不断的重复(超过三次),我们一般将它提取出来,供外部调用。这时候,我们应该把调用上移,即,不要在BLL类中调用BLL层类的方法,而是在BLL层的上一层,我们这里用到了外观模式,所以在BLL的上一层即Facade层(见上面的包图)完成对两个类的方法的调用。

 

举个例子:"上机"需要检查卡号是否存在,"下机"也需要检查卡号是否存在,"充值""退卡","注册卡"都需要检查。这时候我们可以把检查卡号这个操作提取出来。当我们调用的时候,不是在BLL层中直接调用,而是把它提升到Facade层来调用,即,调用上机之前,先调用"检查卡是否存在"

 

下面看看我的BLL



BLL层用到了策略模式:


4、降低UIBLL的耦合,采用外观模式,加入外观(Facade)类

BLL层中有很多,很小的类,这就给UI层的调用带来了困难,外观类这一层为UI层提供了一个简单的接口,大大降低了UI层和BLL层的耦合度,也可以看做是一次粒度上的粗化。

见图:


5、界面层(UI

界面层的类,就是我们的窗体类,有多少个窗体,UI层就有多少个类。

见图:



三、设计模式

上面提到的设计模式有:抽象工厂模式,外观模式,策略模式。在BLL层考虑使用模板方法模式。在UI层,将使用观察者模式,实现状态栏的动态变化。如果使用外部报表控件,很可能用到适配器模式。

 

总结:上述设计只是个人观点,有待在编码过程中验证,欢迎拍砖。




转载于:https://www.cnblogs.com/spring5/archive/2011/10/15/2485292.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263122.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VS 2005 安装一个的小问题

今天通过 添加/删除 安装了VC的部分功能之后,在 程序》Visual Studio 2005 》Visual Studio 2005 Tools 里面竟然找不到 ActiveX Control Test Container 了,但是却有 Spy和 MFC-ATL Trace Tool,建了MFC ActiveX功能在IDE里面 工具 菜单中也找…

《Windows核心编程》学习笔记(9)– 在win7或者vista系统下提升一个进程的运行权限...

win7或者vista默认运行程序是在受限制的环境下运行的,以减轻病毒对于系统的破坏。那么我们怎样才能提升一个进程的权限以至让它在 管理员模式下运行。当然CreateProcess函数没有提供这个功能。相反我们需要调用的是ShellExecuteEx函数: BOOL ShellExecu…

2015第29周二AOP

1、问题:想要添加日志记录、性能监控、安全监测 2、最初解决方案2.1、最初解决方案:在每个需要的类函数中重复写上面处理代。 缺点:太多重复代码,且紧耦合2.2、抽象类进行共性设计,子类进行个性设计,此处不…

Docker-compose配置Mysql,Redis,MongoDB

Docker-compose下配置Mysql,Redis,MongoDB详解一、docker-compose简介二、构建一个实例项目1.前后端实现2.Dockerfile及docker-compose.yml3. 生成镜像三、实例程序源码一、docker-compose简介 Compose是用于定义和运行多容器Docker应用程序的工具。通过…

初学者应该了解的一些SQL语句及hr 用户解锁相关

初学者应该了解的一些SQL语句 1.显示当前连接用户SQL> show user; 2.查看系统拥有哪些用户SQL> select * from all_users; 3.连接到新用户SQL> conn 用户名/密码 4.查询当前用户下所有对象SQL> select * from tab; 5.建立第一个表SQL> create table …

用Delphi 6开发ASP上传组件详解

文件上传是WEB开发中经常要用到的功能,但ASP本身和内置的组件都不支持文件上传功能。网上流传的一些第三方组件虽然能够解决这个问题,但大多是要收费的,更别说Open Source了。本文将详细剖析WEB文件上传的原理,以及一步步指导读者…

使用WebDeployment Project改善VS2005发布网站问题

VS2005发布网站时不会像VS2003一样生成规则的DLL文件、而生成的DLL文件名含有随机数且不能一个项目生成一个DLL文件、让人有一些遗憾、为了做到像vs2003一样,微软发布了WebDeployment Project插件可解决此问题:下载地址1、下载后安装、右键选择vs2005中的…

03 - const static extern

const是一个C语言的关键字,它限定一个变量不允许被改变。使用const可以在一定程度上提高程序的安全性和可靠性,再者在看别人的代码作品的时候也可以有助于清晰理解const所起的作用。 1、const和#define的区别 (1)编译器处理的方式…

Linux、Windows、Mac下Docker的安装与使用

Linux、Windows、Mac下Docker的安装与使用一、Linux下的安装二、Windows与Mac下的安装三、Docker的使用一、Linux下的安装 这里以Centos 7为例,首先,确保系统已经正确运行了Centos 7并已经联网。yum安装gcc环境 yum -y install gcc yum -y install gcc…

[智能架构系列]什么是Buddy智能开发框架

buddy框架,秉承国内优秀框架THINKPHP的优点并增加了很多的商业特性和集成了全版本的商业项目模块,提供给创业者一个最好的选择 组建图: 转载于:https://www.cnblogs.com/scotoma/archive/2011/10/17/2215553.html

Mac nginx PCRE install ngnix

1 下载:pcre-8.12.tar.gz ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre 2 sudo tar xvfz pcre-8.12.tar.gz 解压文件 解压完成之后,执行命令 cd pcre-8.12sudo ./configure --prefix/usr/local --enable-utf8 sudo make sudo make instal…

解决IE6下,给图片加上line-height属性不起作用的方法

在css设置中,我们一般用行高line-height来设定某一行的高度,这在ie7与firefox等浏览器都适用。但当行中有其他元素时(如图片,SPAN,li..)在IE6.0下line-height会不起效果,后来查了下资料,果然如此…

小孔子文章管理系统V2.0发布测试

小孔子文章管理系统V2.0 【感谢】 本系统是仿照nbArticle开发,在此表示感谢nb联盟的作品. 【版权声明】 本软体为开源项目,允许个人使用或修改. 非经小孔子本人授权许可,不得将之用于盈利或非盈利性的商业用途. 欢迎使…

Docker Swarm建立服务器集群

Docker Swarm建立服务器集群一、Docker Swarm简介1. 集群模式2. 管理节点--Manager二、Docker Swarm的配置及使用三、Docker Service向集群中添加服务四、Docker Stack部署集群一、Docker Swarm简介 1. 集群模式 这是Docker官网给出的一张swarm原理图,即swarm就是…

Linux下的版本升级只是浮云

ubuntu从11.04到11.10,直接系统升级,那简直是扯蛋啊 gnome 也是 从2.32到了3 ,ubuntu从此停在了11.04,对我而言。 转载于:https://www.cnblogs.com/x3d/archive/2011/10/18/2661307.html

恢复快速启动栏里的“显示桌面”图标

在百度知道上看到一个提问,大意是说自己不小心把快速启动栏的“显示桌面”图标给删除了,“显示桌面”按钮是大家经常用到的操作按钮,有时误删除掉后,然后使用起来非常不方便。 因为刚刚帮一个朋友解决了同样的问题,所以…

python常用魔法函数

1、__init__(): 所有类的超类object,有一个默认包含pass的__init__()实现,这个函数会在对象初始化的时候调用,我们可以选择实现,也可以选择不实现,一般建议是实现的,不实现对象属性就不会被初始化&#xff…

Python3.4 Django MySQL MySQL-python 安装不成功解决办法 Unable to find vcvarsall.bat 错误

解决办法: 1.安装pymysql pip install pymysql 2.在Django项目中找到跟settings.py在同一个目录下的__init__.py 添加如下代码 import pymysql pymysql.install_as_MySQLdb() 然后就解决了 ----------------------------------------------------------------------…

Go出现警告struct doesn‘t have any exported fields, nor custom marshaling

Go出现警告struct doesnt have any exported fields, nor custom marshalingGo语言要求所有结构体成员变量的首字母需要大写,如果首字母小写的话,则该字段无法被外部包访问和解析,比如,json解析。 type student struct {Id intName string…

苹果MAC系统的安装

搞Iphone开发,没有苹果系统是不行的。由于我已经装好了苹果的雪豹系统,所以在此我只是简单在说一下大休怎么装! 苹果系统,现下在非苹果机上的安装分两种:1、虚拟机安装;2、物理机安装。 现在先说延续一种&a…