应用程序的层次浅谈

原作者的blog地址:http://www.blogjava.net/sitinspring

 

一般来说, 在创建一个应用程序之前,首先要决定这个应用程序的体系结构。应用程序体系结构(Application Architecture)由应用程序开发者设计,它指定了在各种各样的终端系统上,应用程序是如何组织在一起的。为了降低设计难度,大部分程序都以层(称为layer或level)的方式组织在一起,每一层都建立在它的下层基础上,使用下层提供的服务,下层对上层隐藏了许多服务实现的细节。这种方法几乎应用于整个计算机科学领域,也可以称为信息隐藏,数据类型抽象,数据封装,面向对象编程等。

 

分层即是对类进行一些规划,以流程中的类的用途和所处环节划分,把程序中将要用到的各个类分别归纳到各个包(目录)中。分层是对系统进行细分的第一步,它旨在将系统按具体功能和用途分解为相对独立的各个部分.如果说细分是将把难以解决的大问题分解成了各个容易解决的小问题的话,分层则是把解决同类小问题的类归纳到一起,这样程序的结构更加清晰,程序的可读性和可维护性越好,也更容易得到重用。


从大的尺度来讲,一个程序可粗略的分成三个层次:

界面层(UI layer),这是用户能直接感受到的,包含显示和控制两部分;

业务层(Business layer),其中包含了业务逻辑和业务处理;

持久层(Persistence layer),它用来将数据存储和将数据从持久层提取出来。

 


1.界面层(UI layer)中,包含两个层次:视图层View和控制层Controller.

视图层View是用户查看数据,输入和向用户输出结果的一层,这一层是用户唯一能够感受软件功能的窗口,它或者由Swing组件搭建(桌面系统或C/S系统中),或者由JSP搭建(B/S系统),它负责让用户输入数据和将控制层返回的数据显示给客户。其中返回的数据一般是领域对象的变体或者直接就是领域对象或其集合。在Web程序中jsp基本就属于这一层的。

控制层Controller是用来将界面和业务层联系在一起的,在系统的各层次中,应该和View层打交道一般只有Controller层, Controller层是View层和系统其它层次进行交互的中介者, View层越过中介者直接调用其它层次的行为应该尽量避免。

框架类(Framework Classes):这些类一般由固定的框架提供,程序员不能改变.在类的层次上它一般处于界面和业务层之间,即控制层的位置,jsp/servlet中的Servlet,Struts1,2中的Action都是这样的类,它承担了接受用户输入,并展示业务处理的结果的任务.

一般来说,为了减少耦合,提高程序的可维护性,我们一般采用MVC架构模式将业务层,视图层和控制层分开。

 

2.业务层(Business layer)中包含领域层 Domain,服务层 Service和实用工具层Util。

业务层是整个系统的关键部分,它主要由领域模型和业务逻辑组成,领域模型定义系统内相互作用的各个实体,业务逻辑则定义了领域模型所能执行的不同操作, 领域层的各个类代表了领域模型,而服务层的各个类代表了业务逻辑. 领域层和服务层是起点,其它各层都从这里起步.

领域层 Domain:领域对象是对现实世界业务处理对象的抽象和归纳,领域层中的类基本上都是实体(Entity)类,如员工管理系统中的Employee,学籍管理系统中的Student,借贷管理系统中的Contract等,系统的业务处理中用到那些实体对象,领域层中一般就应该有和这个实体对象相对应的实体类。这些类在刚开始设计时可能只有一些属性和对应的getter/setter方法,以后会不断的加入新的内容(主要是方法),如果有必要的话,可以为这些领域对象设计一些上层的抽象类或者接口,借助于泛型,反射,控制反转等高级技能能在一定程度上简化程序的编写过程。此外,领域层是程序的核心内容,因为其他层次都在很大程度上依赖Domain层的设计,如果这一层设计不够完善会使以后的工作步履蹒跚.

服务层Service:这一层就是为领域对象提供服务用的,领域对象一般不直接和表现层,持久层直接打交道而是通过服务层进行代理.服务层是UI层到持久层的中间通道,它处于上通界面下通持久层的中间环节,这个特性是使的这一层决定了软件功能的多少。
一般来说,UI层向服务层传入的是用户输入的一些参数,服务层进行验证,重组后向下层DAO传输;而服务层从Dao层收到的是领域对象或其集合,而它向UI层返回的是领域对象或者其集合的变体或者直接是领域对象或者其集合本身。Service诸类的实例在桌面程序和CS程序中一般作为Model的一个私有成员,而在Web程序中常常要用到时再创建出来。除领域层外,其余各层是在围绕它而设计.通道类(Plumbing Classes,当传输实体类的通道)

实用工具层Util:
这一层相对简单,它包含了各种工具类,类中包含的主要是静态函数和静态成员变量,这些类对共通的函数,变量进行了归纳,它旨在消除重复代码,降低主体代码的复杂程度.一般此层中类的复用程度很高.值得通过项目积累. 辅助类(Assistant Classes)

 

3.持久层(Persistence layer)是直接与持久介质打交道的层次,持久介质可以是常见的关系型数据库,文件甚至Web Service,它一般包含两个部分。

数据存储对象层(DAO层),sql语句一般写在这层中, 然后由它调用;DAO层是最低的一层,与持久介质直接打交道,它包含具体文件的位置,数据库连接等;通道类(Plumbing Classes,当传输实体类的通道)

另一个部分就是持久介质,通常是关系型数据库。
Dao层中各个类一般作为Service的私有成员,供Service调用。

如何从需求中分析出诸个层次中的类呢,我们在大尺度上可以按照下面的步骤进行:

Domain the first:首先从业务流和业务规则中归纳总结出领域对象.
Service the second:为领域对象设计服务类。
Persistence the third:持久层的负责领域对象持久化到持久介质以及逆过程,它的设计在领域层和服务层之后,比较典型的持久层设计有数据库表的设计和ER图(实体关系图)的绘制.
View the last:最后设计表现层,表现层受领域层和服务层制约, 容易变化且易于修改,通常放在最后实现.

 

4.具体步骤如下

1)理解,分析,钻研需求,彻底了解你的客户想要什么,需要你做些什么.
2)将大系统分解成一个个子系统,细分出各个层次,搞清楚各层的任务。
3)分析业务逻辑,归纳出业务流.
4)从业务流和业务规则中总结出领域对象.
5)为领域层实现服务层.
6)以Domain层和Service层为核心设计表现层和持久层,直到形成完整的程序.
7)加入实用层消除重复代码,梳理结构和简化流程,.
8)限制跨层的调用.



 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值