由于个人学习之初,第一次使用三层架构的时候就是用的抽象三层架构模式,当时个人笨得不知道用工具,主要原因是个人当时的观点是:用一个新工具时,还得去熟悉新工具;刚学习的时候重点是技术;在技术比较熟练后再用工具来提高效率。

学习三层结构模式最好的方式就是拿一个(带三层模式)项目来实践。第一次我用的是petshop,使用的是抽象三层架构,但是项目还没有跑不起来,自己也没去调试,在项目实践中就学习套用了该三层模式(主要觉得代码组织形式很好)。在工作中,项目使用的是简单三层工厂!在适应中很难去接受这样的架构,主要是冗余太多,修改起来非常麻烦!

普通三层是所有东西已知,架构是竖井方式。
抽象工厂则是面向未知,架构是横向扩展。

一、简单三层架构:

1、从上图可以宏观看出从单类层到简单三层的实现,具体代码(例如vs里面选择部分代码->右击->重构->提取方法;右击->重构->提取结构)。

1)一层到二层:单层代码组织显得非常混乱。

2)二层到三层:业务逻辑层的加入起到了缓冲的作用,业务逻辑层跟业务紧密相连(如可放置权限,某段时间可修改等业务规则)。

此外,领域对象对数据访问层数据对象的封装,也有利于表示层对业务逻辑层的调用。在三层式架构中,表示层应该是对于数据访问层是“无知”的,这样既减少了层与层间的依赖关系,也能有效避免“循环依赖”的后果。

唯一可堪欣慰的是,由于我们采用分层式架构将用户界面与业务领域逻辑完全分离,一旦用户界面发生更改,例如将B/S架构修改为C/S架构,那么业务逻辑层的实现模块是可以完全重用的

3)Model层的引入:各个层之间用参数传递可能参数个数太多,而且编码不易阅读。将各个传递的参数封装起来,各个层传递的Model可能有所不同!

    二、抽象工厂三层架构:

上图为简单三层架构到抽象三层架构的过程:

 1)为什么要DAL要定义接口类:将具体的实现延迟到具体的类(如sql、oracle等访问)。

2)抽象工厂的作用:其实工厂就是利用反射机制动态加载类。抽象工厂则是面向未知!如果想切换数据(如从sql server改为oracle数据库似乎不太可能,这时就需要工厂三层架构),有了抽象工厂就可以通过配置文件进行简单的配置,不用重新编译就可实现不同数据库的部署工作!

抽象工厂三层架构的优势:

1)抽象工厂可以给系统带来更大的可扩展性和尽量少的修改量。最大的好处就是,我们在添加产品的时候只需要添加具体的产品类和“工厂类”,而不用修改原来的代码。

2)只要设计合理,规范了各个层次的接口方法,三层式架构的设计完全可以分离开由不同的开发人员同时开发,这就可以有效地利用开发资源,缩短项目开发周期。

3)降低各层之间的耦合,使项目结构更清楚,分工更明确,有利于后期的维护和升级;多数是为了方便自己更改,维护和扩展

一般在以下情况可以实用抽象工厂设计模式:一个系统要独立于它产品的创建、组合和表示时;一个系统要由多个产品系列中的一个来配置时。注:这里的产品与抽象工厂中的产品有区别。

总之,抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,运用抽象工厂模式的关键点在于应对“多系列对象创建”的需求变化。一句话,学会了抽象工厂模式,你将理解OOP的精华:面向接口编程。

三、权限设置和三层架构中的业务逻辑层

现在不管什么系统几乎都和权限有关联,一般网站、论坛都有会员制,只有特定用户采用特殊的操作。企业权限管理设计用得较多的是基于角色的权限管理(资料参见http://www.ltesting.net/ceshi/ruanjianceshikaifajishu/rjcskfyy/sjk/2007/0608/28036.html)。

基于权限的表设计不是很复杂,复杂的是多对多的关系!常常和业务逻辑关联,比如说某学校的教务系统,某些人在特定时间有特定操作<该特殊权限需要用户定制>。

设计原则归结为:“系统只提供粗粒度的权限,细粒度的权限被认为是业务逻辑的职责”。其实粗粒度就是该系统有who+what+how的问题,即某种用户+对某个按钮(资源)+点击/(操作)的问题,细粒度是业务逻辑解决,即某种用户+在某段时间(业务逻辑层)+对某个按钮(资源)+点击/(操作)的问题。

基于角色权限表设计可参考http://www.iteye.com/topic/930648

他的表结构设计还挺好,基于觉得的权限中心当然是角色,所有的权限设置都是通过角色来设定的,不过个人亲身实践觉得在角色在增加一个角色类型表,以便定制不同角色的菜单树、权限树!

三层架构:参考http://www.doc88.com/p-410726446970.html

三层抽象工厂模式:参考 http://www.cnblogs.com/cbf4life/archive/2009/12/23/1630612.html

基于角色权限管理(数据库)表设计:参考http://www.iteye.com/topic/930648

转载于:https://www.cnblogs.com/jilonglv/archive/2012/10/06/2712866.html

为什么用抽象三层结构相关推荐

  1. 谈 三层结构与MVC模式的区别

    谈 三层结构与MVC模式的区别 在CSDN和园子里有朋友谈到三层与MVC的区别,以前也有人抛出这个问题,本人对来公司面试的朋友也偶乐会提这方面的问题.     那么我也来讲讲我对这两者的理解吧.    ...

  2. mvc与三层结构终极区别

    又看到有人在问三层架构和MVC的关系,感觉这种问题有点教条化了.因为它们都在逻辑上将应用程序划为三块,凑了一个数字3,就有人非要把它们联系到一起了. 这两个东西我接触有几年了,有一点体会,表达一下: ...

  3. MVP+WCF+三层结构搭建项目框架(上)

    最近,我一直在重构之前做的一个项目,在这个过程中感慨万千.原先的项目是一个运用了WCF的C/S系统,在客户端运用了MVC模式,但MVC的View.Model耦合以及WCF端分布式欠佳等问题让我有了重构 ...

  4. c/s三层结构信息系统的三个层次_网络资讯:三层架构是什么

    今天来说一下三层架构是什么这方面的一些讯息,不少朋友对一个完整计算机系 统的组成部分应该是这方面的一些讯息颇感兴趣的,小编今天就整理了一些信息,希望对有需要的朋友 有所帮助. 三层架构 通常意义上的三 ...

  5. 浅谈“三层结构”原理与用意(转帖)

    浅谈"三层结构"原理与用意 序 在刚刚步入"多层结构"Web应用程序开发的时候,我阅读过几篇关于"asp.net三层结构开发"的文章.但其多 ...

  6. [转]MVP+WCF+三层结构搭建项目框架

    最近,我一直在重构之前做的一个项目,在这个过程中感慨万千.原先的项目是一个运用了WCF的C/S系统,在客户端运用了MVC模式,但MVC的View.Model耦合以及WCF端分布式欠佳等问题让我有了重构 ...

  7. 从经典的MVC模式到Web三层结构

    暑假这段时间,在海康这边实习,参与了海康iVMS-8700客户端的开发,对MVC有了新的认识,将之前写的这篇博客更新一下.有错误的地方,欢迎大家批评指正. 经典的MVC 什么是MVC? 先来说说MVC ...

  8. (转载/侵删)mvc与三层结构终极区别

    结合自己做过的项目做的总结:三层结构和MVC是从功能性,表现方式两个角度来划分的两种方式 三层结构是从程序功能角度来划分,即每层结构应用到的程序,逻辑,功能一般不同.如:在web应用开发中,后台ser ...

  9. BP神经网络的梯度公式推导(三层结构)

    本站原创文章,转载请说明来自<老饼讲解-BP神经网络>bp.bbbdata.com   目录 一. 推导目标 1.1 梯度公式目标 1.2 本文梯度公式目标 二. 网络表达式梳理 2.1 ...

最新文章

  1. node java php_服务端I/O性能:Node、PHP、Java、Go的对比
  2. Linux Ethercat主站
  3. java检测按键_java – 在控制台中检测按键
  4. 使用js命名空间进行模块式开发
  5. LeetCode 932. 漂亮数组(分治递归/循环)
  6. 页面某个模块的文字内容是动态的,可能是几个字,也可能是一句话。然 后,希望文字少的时候居中显示,文字超过一行的时候居左显示。该如何实现?...
  7. java stub_Java Stub 研究学习(2)
  8. Unity3D中JavaScript与C#对比
  9. Linux进程间通信(信号量)
  10. oracle比较强大的函数,SQL和ORACLE函数比较
  11. IDEA 中如何查看maven项目中所有jar包的依赖关系图
  12. 11-13 模块_collections(不太重要)timerandomos
  13. 使用AD将Gerbera文件转化为PCB文件的那些事
  14. SQL循环算出移动加权平均
  15. Android 自定义锁屏_分享一款MIUI10精致主题,多种时间样式可选,可自定义字体颜色...
  16. 开源项目推荐:我个人中意的Python/C++/.Net数学库(★精品收藏★)
  17. 解决idea在运行时出现Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8?
  18. matlab BPSK调制方式代码实现
  19. 当北京爷们遭遇上海男人
  20. Centos设置自带中文输入法

热门文章

  1. 分布式数据库系统(DDBS) 概述
  2. 谈asp.net解决方案的项目生成时的输出路径
  3. Windows下Anaconda2(Python2)和Anaconda3(Python3)的共存
  4. 用Excel画五线谱!
  5. python3面向对象(1)
  6. 老版本select2设置初始值
  7. log4j(七)——log4j.xml简单配置样例说明
  8. 【Python】Numpy扩充数组函数之repeat和tile用法
  9. keepalived高可用反向代理的nginx
  10. 关于Linux路由表的route命令(转)