zoukankan      html  css  js  c++  java
  • 三层架构(我的理解及具体分析)

    三层架构已经学了一段时间,一直想做一个比較完整、比較完美的总结。可是左思右想,不知道怎样下笔。都说万事开头难嘛,今天整理了一下凌乱的思路,哎,还是没整理好,想到哪就说到哪吧。

     

    刚開始学习的人非常不理解:

    1,什么是三层?

    2,为什么使用三层?

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

    4,怎样学好三层?怎样应用三层?

    ……

    这篇博客里我会给大家一一解释一下,略懂皮毛忘大家见谅!!!

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

    对于三层我左思右想,怎样与实际相联系。好嘛,昨晚突然有了“灵感”。还记得大话设计模式里第23章大鸟和小菜吃羊肉串的故事——由在小摊吃到饭店吃引来的一个命令模式(当然今天不是研究命令模式)。服务员、厨师、採购员。

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

     

     

    先了解:

     

    1,什么是三层?

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

     

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

     

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

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

    1>单项引用(见下图)

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

     

    Entity(实体层):它不属于三层中的不论什么一层,可是它是不可缺少的一层。

     

    Entity在三层架构中的作用:

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

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

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

    3,对于刚開始学习的人来说,能够这样理解:每张数据表相应一个实体,即每一个数据表中的字段相应实体中的属性(注:当然,其实不是这样。为什么?1>,可能我们须要的实体在数据表相应的实体中并不存在;2>,我们全然能够将全部数据表中的全部字段都放在一个实体里)

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

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

     

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

     

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

     

    思想来源于生活:

     

     

    服务员:仅仅管接待客人;

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

    採购员:仅仅管按客人点菜的要求採购食材;

     

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

     

    他们三者是怎样联系的?

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

     

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

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

     

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

     

    这样讲,不知道大家是不是能够明确。(待会实例解释吧)

     

    2,为什么使用三层?

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

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

    1)服务员(UI层)请假——另找服务员;厨师(BLL层)辞职——招聘还有一个厨师;採购员(DAL)辞职——招聘还有一个採购员;

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

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

     

    不论什么一层发生变化都不会影响到另外一层!!!

     

    3,与两层的差别??

    两层:

     

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

     

    三层:

     

     

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

     

    综上:三层架构的

    优势:1,结构清晰、耦合度低,2,可维护性高,可扩展性高;3,利于开发任务同步进行;easy适应需求变化

     

    劣势:1、减少了系统的性能。这是不言而喻的。假设不採用分层式结构,非常多业务能够直接造訪数据库,以此获取对应的数据,现在却必须通过中间层来完毕。

    2、有时会导致级联的改动。这样的改动尤其体如今自上而下的方向。假设在表示层中须要添加一个功能,为保证其设计符合分层式结构,可能须要在对应的业务逻辑层和数据訪问层中都添加对应的代码

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

     

    4,三层的详细表现形式??

     

    UI

    (大家不要误会,UI层不仅仅是一个个用户界面,也是须要有代码的)

     

    (1,功能:用户输入数据、反馈给用户数据;2,大家观察代码:没有涉及到业务逻辑,直接传參、函数、方法调用,没有涉及到与数据库打交道的SQL语句和ADO.net)

     

    BLL

     

    1BLL是表示层与数据訪问层之间的桥梁,负责数据处理、传递;2,大家观察代码,没有涉及到界面上的控件,没有涉及到SQL语句和ADO.net

     

    DAL

     

     

     

     

    (1,以上是DAL层中DbUtil类、user_DA类和workRecord_DA类中的代码;2,大家观察代码,没有涉及到界面控件,没有涉及到业务逻辑;仅仅有与数据库打交道的SQL语句和ADO.net)

     

    EntityModel)层:

    (定义了实体类user

    观察以上三层:

    1,实体类user作为參数贯穿于三层之间;

    2,通过传參、方法调用来实现功能;

    3,各层之间各负其责;互不影响

     

    对照两层结构,让大家深刻体会三层的极大优点:

    还是以机房收费系统的登陆为例:

    (观察上面的两层的代码:将业务逻辑、数据訪问都展如今用户表现层,当需求须要改变时,须要改变整个系统。比方,我把文本框txtPassWord的名称改为txtPwd的话,大家观察一下得须要更改多少地方。这种修改算是小的,假设真的有业务需求上的修改才叫麻烦复杂,程序猿不跳楼才怪。呵呵、、开个玩笑)

    与如此难以适应需求变化的两层相比,大家再次观察三层代码,再次思考,三层架构有什么优点呢?自己思考。。。。。

     

    自己去发掘吧!!!

  • 相关阅读:
    1、编写一个简单的C++程序
    96. Unique Binary Search Trees
    python 操作redis
    json.loads的一个很有意思的现象
    No changes detected
    leetcode 127 wordladder
    django uwsgi websocket踩坑
    you need to build uWSGI with SSL support to use the websocket handshake api function !!!
    pyinstaller 出现str error
    数据库的读现象
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4184867.html
Copyright © 2011-2022 走看看