重构机房收费系统(二)

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


二、概要设计

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

 

下面看我的包图:


可以看到,这个包图,是从最经典的三层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,一经查实,立即删除!

相关文章

《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应用程序的工具。通过…

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

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

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

Docker Swarm建立服务器集群

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

python常用魔法函数

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

苹果MAC系统的安装

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

sphinx和coreseek

sphinx是国外的一款搜索软件。 coreseek是在sphinx的基础上,增加了中文分词功能,换句话说,就是支持了中文。 Coreseek发布了3.2.14版本和4.1版本,其中的3.2.14版本是2010年发布的,它是基于Sphinx0.9.9搜索引擎的。而4.…

Spring security/Shiro ---登陆成功后返回登陆前界面<页面重定向>

Spring security ---登陆成功后返回登陆前界面<页面重定向>问题&#xff1a;在登陆/退出成功后&#xff0c;我们往往通过http.formLogin().successForwardUrl()和http.logout().logoutSuccessUrl()设定操作成功后的回跳页面。我们现在希望在任意界面跳转到登陆界面后&…

针对plsql developer使用做的三个小设置

来自&#xff1a;http://www.cnblogs.com/william-lee/archive/2010/12/08/1900176.html 1、原来大家在sql窗口写多条sql语句&#xff0c;如果点击“执行”&#xff0c;那么会执行窗口下的所有语句&#xff0c;如果向执行所要的语句&#xff0c;必须选定它。 那么&#xff0c;有…

今天将Notebook还原了, 第一次外加了外围电路

因为天气太热了, 我的Aspire 5502出了问题, 用Ghost还原中途死机, 找了问题原来是太热了....又在宿舍, 没有空调, 又不想去图书馆, 最后就问奶仔借了部风扇, 总算搞掂了...相机太快了....看上去风扇好像停了....不仅有风扇, 它还要裸跑才能胜利还原....温度一高就自动关机了...…

VMware开启NAT模式/仅主机模式后主机ping不通虚拟机的问题

VMware开启NAT模式/仅主机模式后主机ping不通虚拟机的问题问题&#xff1a;VMware设置网络模式为NAT模式后&#xff0c;我们使用主机ping虚拟机无法联通&#xff0c;用虚拟机ping主机可以联通。 原因&#xff1a;这是由于虚拟机的IP网段与主机的VMnet8网段不一致所造成的。 解…

OO设计原则总结

什么是设计原则&#xff1f; 设计原则是基本的工具&#xff0c;应用这些规则可以使你的代码更加灵活、更容易维护&#xff0c;更容易扩展。 基本原则封装变化Encapsulate what varies. 面向接口编程而非实现 Code to an interface rather than to an implementation.优先使用组…

kubectl get node运行时出现:Unable to connect to the server: x509: certificate signed by unknown authority

kubectl get nodes运行时出现&#xff1a;Unable to connect to the server: x509: certificate signed by unknown authority原因&#xff1a;我们在运行kubeadm reset时&#xff0c;没有删除原先的$HOME/.kube文件导致新建的kubelet报错。实际上在kubeadm reset执行后&#x…

POJ 1966 Cable TV Network (最大流最小割)

$ POJ~1966~Cable~TV~Network $ $ solution: $ 第一眼可能让人很难下手&#xff0c;但本就是冲着网络流来的&#xff0c;所以我们直接一点。这道题我们要让这个联通图断开&#xff0c;那么势必会有两个点变得不连通&#xff0c;这道题的数据范围很小&#xff0c;所以我们试着暴…

harbor安装时出现ERROR: An HTTP request took too long to complete. Retry with --verbose to obtain debug in

harbor安装时出现ERROR: An HTTP request took too long to complete. Retry with --verbose to obtain debug information.If you encounter this issue regularly because of slow network conditions, consider setting COMPOSE_HTTP_TIMEOUT to a higher value current val…

配置msdtc

配置msdtc需要分别配置数据库服务器和开发机&#xff0c;因为只有两个机器都配置正确了&#xff0c;分布式事务才不会报乌七八糟的错误。如果数据库服务器和开发机是同一台机器&#xff0c;那就不用看本文了&#xff0c;因为不存在分布式事务的问题。 数据库服务器和开发机中配…

什么是套接字?Socket基本介绍

什么是套接字&#xff1f;Socket基本介绍一、什么是套接字&#xff1f;二、套接字特性三、套接字缓冲区一、什么是套接字&#xff1f; 套接字是一种通信机制&#xff08;通信的两方的一种约定&#xff09;&#xff0c;socket屏蔽了各个协议的通信细节&#xff0c;提供了tcp/ip…