注册本站  论坛  繁體中文

电脑技巧
手机 | MP3 | MP4 | 显卡 | 主板 | 显示器 | 光存储 | 笔记本 | 网络设备 | 移动存储 | 数码相机
键鼠 | CPU | 音箱 | GPS | 电视 | 服务器 | 投影机 | 机箱电源 | 品牌电脑 | 办公打印 |
| 网站首页 | Cisco | Windows | Linux | Java | Dotnet | Oracle | 网页设计 | 平面设计 | 安全 | 软件应用 | 电脑维修 | 办公维修 |
您现在的位置: 电脑技巧 >> Java >> J2EE >> J2ee核心 >> Java正文

对J2EE应用系统分层设计的思考

文章来源:中国IT实验室整理 作者:佚名 更新时间:2008-8-23 14:38:19 【 】 【加入收藏

    J2EE分层设计是Java企业应用的最基本的设计思想。

    从最常规的分层结构来说,系统层次从上到下依次为:

    表现层:主要是客户端的展示。

    服务层:直接为客户端提供的服务或功能。也是系统所能对外提供的功能。

    领域层:系统内的领域活动。

    DAO层:数据访问对象,通过领域实体对象来操作数据库。

    其中有些指导原则:

    1、上层总是依赖其下层,依赖关系不跨层。

    2、表现成除外,同一层之间方法不允许相互调用。这是实际开发中一些开发者容易范的错误!如果真是同一层之间存在方法调用,需要注意,这些调用都是一些上层不可见方法,比如一些工具方法等。

    3、一切从服务层出发,从系统需要提供的功能进行分析,确定Service接口中的方法。而不是从数据库的表出发,创建DAO,再创Domain,然后Service,这实际上是对系统分层的误解。

    4、系统最核心的设计就是将系统中的实体划分为领域模型。在此基础上设计数据的DAO层,并将这些活动暴露给服务层,服务层的实现依赖于领域活动。

    5、每个接口的职责范围明确有界。

    在我所做的系统中,常常看到一些糟糕的编码:系统设计从表开始,一个表对应一个DAO,一个DAO对应一个domain,一个Domain对应一个Service,实际上Service的接口和DAO的接口基本上完全一样!导致Service的接口方法超多!到了表现层,前台程序员在写Action的时候,Action中反复的调用Service方法,代码不堪入目。

    正确的设计应该是,一个领域活动会聚合对应一个或一组DAO,来完成一个领域活动。而一个服务可能包含两个领域活动,比如一个转账的业务,对应两个领域活动。两个帐户的金额分别发生变化,需要操作一组领域活动,而每个活动需要操作很多表(调用多个DAO)。 事务的控制我们可以放到Service层。

    目前,越来越多的架构师喜欢领域模型驱动设计,针对系统的领域模型建模,然后上层直接是Service,Service下面就是领域活动层Activity,从而去掉了DAO层,这样做的优点是系统设计思路更清晰,目标更明确。可以避免上面所说的一个表对应一个DAO、Service的情况。

    但缺点是当领域活动发生变化的时候,会引起领域活动层代码的变化。并且,当要更换持久化框架或者技术时候,领域活动要重新实现。

    但综合考虑起来,这样带来的优点也很多,而实际上更换数据库和持久化框架的情况很少,因此这样的设计也是有其合理性一面的。这样做实际上是将原来的DAO和Domain层合并为一个Activity.但上层的设计思路还是一致的。

    其实Service层的设计也很讲究,其中就是要控制Service的数量,从Service层往下,接口数量逐层增加。通常将一个模块的服务都集中到一个Service中来处理。

    每层中的每个接口都应该关注的是自己的那一块,而不是吃着碗里看着锅里,牛槽伸出个狗舌头,最典型的例子就是一个DAO中胡乱操作别的表。这种凌乱的实现只会置项目经理与死地。也会为软件的维护带来很大代价。

    笔者曾遇到这样的团队,缺乏对整个项目的整体设计,一个表一个DAO,对应一个Service,系统也不大,三四十张表,但是性能相当地下,经常down机。

    最终发现,失败不是开源框架和数据库以及应用服务器和硬件配置的错,根源在于拙劣的设计导致。

    希望以后大家在做项目的时候能注意点。

    原文出处:http://lavasoft.blog.51cto.com/62575/83974

  • 上一篇Java:

  • 下一篇Java: 没有了
  • 最 新 热 门
     Flash、HTML、Ajax 谁将赢得Web应用之战
     超越XML和JSON:YAML,Java开发人员的新选择
     优秀Java程序员必须了解的GC工作原理
     Java 6 RowSet 使用完全剖析
     pureQuery带注释的方法风格简介
     面向Java开发人员的Scala指南: 实现继承
     Java 6中的性能优化
     Java实现Windows的dir命令
     Java标准类库提供的容器总结
     在Tomcat上开发Web应用如何保证兼容性
    最 新 推 荐
     对J2EE应用系统分层设计的思考
     Apusic Operamasks的资源注入
     关于J2EE中的乱码解决
     排序链树搜索算法在GIS POI关键字搜索中的应…
     Java异常处理:如何避免重复打印异常
     JLDAP 连接池的创建及测试程序
     Java Persistence API (JPA) 的陷阱
     通过JMX来获得web service的信息
     如何才算掌握了Java EE
     分散关注的编程方法 AOP
    相 关 文 章

    J2EE综合:Struts上传多个文件的例子
    J2ME(JSR75)组件之文件选择器
    J2me中低级界面字体处理
    J2ME手机游戏:Canvas类基本绘图实例
    J2ME手机游戏:Canvas类基本绘图应用
    J2ME手机游戏:TimerTask与Timer类的应用
    J2ME手机游戏:运行实现Runnable接口的类
    J2ME手机游戏设计:Thread类
    J2ME中的GIF处理类
    J2ME网络应用程序性能探讨

    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告

     

    Copyright 2006-2008 pcjx.com All Rights Reserved
    电脑技巧 版权所有 粤ICP备06059145号 地图
    本网站所有内容未经许可不得转载或做其他使用