zoukankan      html  css  js  c++  java
  • 三层架构及生活实例

    概述

    三层架构(3-tierarchitecture) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合的思想。

    在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层、业务逻辑层(又或称为领域层)、表示层。

    1. 表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。
    2. 业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。
    3. 数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、查找等。

    3个层次中,系统主要功能和业务逻辑都在业务逻辑层进行处理。

    所谓三层体系结构,是在客户端与数据库之间加入了一个中间层,也叫组件层。这里所说的三层体系,不是指物理上的三层,不是简单地放置三台机器就是三层体系结构,也不仅仅有B/S应用才是三层体系结构,三层是指逻辑上的三层,即把这三个层放置到一台机器上。

    三层体系的应用程序将业务规则、数据访问、合法性校验等工作放到了中间层进行处理。通常情况下,客户端不直接与数据库进行交互,而是通过COM/DCOM通讯与中间层建立连接,再经由中间层与数据库进行交互。

    各层作用:

    1数据访问层:主要是对原始数据(数据库或者文本文件等存放数据的形式)的操作层,而不是指原始数据,也就是说,是对数据的操作,而不是数据库,具体为业务逻辑层或表示层提供数据服务.

    2:业务逻辑层:主要是针对具体的问题的操作,也可以理解成对数据层的操作,对数据业务逻辑处理,如果说数据层是积木,那逻辑层就是对这些积木的搭建。

    3:表示层:主要表示WEB方式,也可以表示成WINFORM方式,WEB方式也可以表现成:aspx,如果逻辑层相当强大和完善,无论表现层如何定义和更改,逻辑层都能完善地提供服务。

    表示层

    位于最外层(最上层),最接近用户。用于显示数据和接收用户输入的数据,为用户提供一种交互式操作的界面。

    业务逻辑层

    业务逻辑层(Business Logic Layer)无疑是系统架构中体现核心价值的部分。它的关注点主要集中在业务规则的制定、业务流程的实现等与业务需求有关的系统设计,也即是说它是与系统所应对的领域(Domain)逻辑有关,很多时候,也将业务逻辑层称为领域层。例如Martin Fowler在《Patternsof Enterprise Application Architecture》一书中,将整个架构分为三个主要的层:表示层、领域层和数据源层。作为领域驱动设计的先驱Eric Evans,对业务逻辑层作了更细致地划分,细分为应用层与领域层,通过分层进一步将领域逻辑与领域逻辑的解决方案分离。

    业务逻辑层在体系架构中的位置很关键,它处于数据访问层与表示层中间,起到了数据交换中承上启下的作用。由于层是一种弱耦合结构,层与层之间的依赖是向下的,底层对于上层而言是无知的,改变上层的设计对于其调用的底层而言没有任何影响。如果在分层设计时,遵循了面向接口设计的思想,那么这种向下的依赖也应该是一种弱依赖关系。因而在不改变接口定义的前提下,理想的分层式架构,应该是一个支持可抽取、可替换的抽屉式架构。正因为如此,业务逻辑层的设计对于一个支持可扩展的架构尤为关键,因为它扮演了两个不同的角色。对于数据访问层而言,它是调用者;对于表示层而言,它却是被调用者。依赖与被依赖的关系都纠结在业务逻辑层上,如何实现依赖关系的解耦,则是除了实现业务逻辑之外留给设计师的任务。

    数据层

    数据访问层:有时候也称为是持久层,其功能主要是负责数据库的访问,可以访问数据库系统、二进制文件、文本文档或是XML文档。

    简单的说法就是实现对数据表的SelectInsertUpdateDelete的操作。如果要加入ORM的元素,那么就会包括对象和数据表之间的mapping,以及对象实体的持久化。

    规则

    三层程序有一些需要约定遵守的规则:

    最关键的,UI层只能作为一个外壳,不能包含任何业务逻辑(BizLogic)的处理过程

    设计时应该从BLL出发,而不是UI出发.BLL层在API上应该实现所有BizLogic,以面向对象的方式

    不管数据层是一个简单的SqlHelper也好,还是带有Mapping过的Classes也好,应该在一定的抽象程度上做到系统无关

    不管使用COM+(EnterpriseService),还是Remoting,还是WebService之类的远程对象技术,不管部署的时候是不是真的分别部署到不同的服务器上,最起码在设计的时候要做这样的考虑,更远的,还得考虑多台服务器通过负载均衡作集群

    所以考虑一个项目是不是应该应用三层/多层设计时,先得考虑下是不是真的需要?实际上大部分程序就开个Web Application就足够了,完全没必要作的这么复杂. 多层结构,是用于解决真正复杂的项目需求的。

    优点

    1、开发人员可以只关注整个结构中的其中某一层;

    2、可以很容易的用新的实现来替换原有层次的实现;

    3、可以降低层与层之间的依赖;

    4、有利于标准化;

    5、利于各层逻辑的复用。

    6、结构更加的明确

    7、在后期维护的时候,极大地降低了维护成本和维护时间

    缺点

    1、降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。

    2、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。

    3、增加了开发成本。

     

    生活实例

    1,什么是三层?

    2,为什么使用三层?

    3,三层与以往使用的两层相比有什么不同?它的优势在哪里?

    4,如何学好三层?如何应用三层?

    ……

    老师一直强调:让学习和生活结合,把学习和生活联系,这样的学习才叫会学习,会生活。

    对于三层我左思右想,如何与实际相联系。好嘛,昨晚突然有了“灵感”。还记得大话设计模式里第23章大鸟和小菜吃羊肉串的故事——由在小摊吃到饭店吃引来的一个命令模式。

    服务员、厨师、采购员。

    这不就是个典型的三层架构吗???(⊙ o ⊙ )啊!哈哈(这个后面再做解释)


    先了解:

    1,什么是三层?

    UI(表现层):主要是指用户交互的界面。用于接收用户输入的数据和显示处理后用户需要的数据。

    BLL:(业务逻辑层):UI层和DAL层之间的桥梁实现业务逻辑。业务逻辑具体包含:验证、计算、业务规则等等。

    DAL:(数据访问层):与数据库打交道。主要实现对数据的增、删、改、查。将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库。(当然这些操作都是基于UI层的。用户的需求反映给界面(UI),UI反映给BLL,BLL反映给DAL,DAL进行数据的操作,操作后再一一返回,直到将用户所需数据反馈给用户)


    每一层都各负其责,那么该如何将三层联系起来呢?

    1>单项引用(见下图)

    2>这时候实体层(Entity来了。(注:当然,实体层的作用不止这些)

    Entity(实体层):它不属于三层中的任何一层,但是它是必不可少的一层。

    Entity在三层架构中的作用:

    1,实现面向对象思想中的"封装";

    2,贯穿于三层,在三层之间传递数据;

    注:确切的说实体层贯穿于三层之间,来连接三层)

    3,对于初学者来说,可以这样理解:每张数据表对应一个实体,即每个数据表中的字段对应实体中的属性注:当然,事实上不是这样。为什么?1>,可能我们需要的实体在数据表对应的实体中并不存在;2>,我们完全可以将所有数据表中的所有字段都放在一个实体里)

    4,每一层(UI—>BLL—>DAL)之间的数据传递(单向)是靠变量或实体作为参数来传递的,这样就构造了三层之间的联系,完成了功能的实现。

    但是对于大量的数据来说,用变量做参数有些复杂,因为参数量太多,容易搞混。比如:我要把员工信息传递到下层,信息包括:员工号、姓名、年龄、性别、工资....用变量做参数的话,那么我们的方法中的参数就会很多,极有可能在使用时,将参数匹配搞混。这时候,如果用实体做参数,就会很方便,不用考虑参数匹配的问题,用到实体中哪个属性拿来直接用就可以,很方便。这样做也提高了效率。

    注:这里为什么说可以暂时理解为每个数据表对应一个实体??答:大家都知道,我们做系统的目的,是为用户提供服务,用户可不关心你的系统后台是怎么工作的,用户只关心软件是不是好用,界面是不是符合自己心意。用户在界面上轻松的增、删、改、查,那么数据库中也要有相应的增、删、改、查,而增删改查具体操作对象就是数据库中的数据,说白了就是表中的字段。所以,将每个数据表作为一个实体类,实体类封装的属性对应到表中的字段,这样的话,实体在贯穿于三层之间时,就可以实现增删改查数据了)

    综上所述:三层及实体层之间的依赖关系:

     

     

    思想来源于生活:

     

    服务员:只管接待客人;

    厨师:  只管做客人点的菜;

    采购员:只管按客人点菜的要求采购食材;

    他们各负其职,服务员不用了解厨师如何做菜,不用了解采购员如何采购食材;厨师不用知道服务员接待了哪位客人,不用知道采购员如何采购食材;同样,采购员不用知道服务员接待了哪位客人,不用知道厨师如何做菜。

    他们三者是如何联系的?

    比如:厨师会做:炒茄子、炒鸡蛋、炒面——此时构建三个方法(cookEggplant()、cookEgg()、cookNoodle())

    顾客直接和服务员打交道,顾客和服务员(UI层)说:我要一个炒茄子,而服务员不负责炒茄子,她就把请求往下递交,传递给厨师(BLL层),厨师需要茄子,就把请求往下递交,传递给采购员(DAL层),采购员从仓库里取来茄子传回给厨师,厨师响应cookEggplant()方法,做好炒茄子后,又传回给服务员,服务员把茄子呈现给顾客。

    这样就完成了一个完整的操作。

    在此过程中,茄子作为参数在三层中传递,如果顾客点炒鸡蛋,则鸡蛋作为参数(这是变量做参数)。如果,用户增加需求,我们还得在方法中添加参数,一个方法添加一个,一个方法设计到三层;何况实际中并不止设计到一个方法的更改。所以,为了解决这个问题,我们可以把茄子、鸡蛋、面条作为属性定义到顾客实体中,一旦顾客增加了炒鸡蛋需求,直接把鸡蛋属性拿出来用即可,不用再去考虑去每层的方法中添加参数了,更不用考虑参数的匹配问题。

    2,为什么使用三层?

    使用三层架构的目的:解耦!!!

    同样拿上面饭店的例子来讲:

    (1)服务员(UI层)请假——另找服务员;

    厨师(BLL层)辞职——招聘另一个厨师;

    采购员(DAL)辞职——招聘另一个采购员;

    (2)顾客反映:1>你们店服务态度不好——服务员的问题。开除服务员;

    2>你们店菜里有虫子——厨师的问题。换厨师;

    任何一层发生变化都不会影响到另外一层!!! 

    3,与两层的区别??

    两层:


    (当任何一个地方发生变化时,都需要重新开发整个系统。“多层”放在一层,分工不明确耦合度高——难以适应需求变化,可维护性低、可扩展性低)

    三层:

     


    (发生在哪一层的变化,只需更改该层,不需要更改整个系统。层次清晰,分工明确,每层之间耦合度低——提高了效率,适应需求变化,可维护性高,可扩展性高)

    综上:三层架构的

    优势:1,结构清晰、耦合度低,

    2,可维护性高,可扩展性高;

    3,利于开发任务同步进行;容易适应需求变化

    劣势:1、降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。

    2、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码

    3、增加了代码量,增加了工作量

    4,三层的具体表现形式??

     

    更多参考:三层架构

  • 相关阅读:
    JavaScript高级程序设计读书笔记(二)变量 作用域和内存
    JavaScript高级程序设计读书笔记(一)基础概念
    angular6 + ng-zorro鹿途后台管理系统(三)项目升级改造 01 升级ng-zorro-antd到1.8+
    angular6 + ng-zorro鹿途后台管理系统(三)环境变量配置
    angular6 + ng-zorro鹿途后台管理系统(二)项目结构规划
    angular6 + ng-zorro鹿途后台管理系统(一)
    web-view——微信小程序嵌入H5
    JS知识整理随笔(8) BOM
    JS知识整理随笔(7) DOM事件
    基础信息论 (复习)
  • 原文地址:https://www.cnblogs.com/peterYong/p/6556574.html
Copyright © 2011-2022 走看看