zoukankan      html  css  js  c++  java
  • 三层浅析及示例分析

    什么是三层结构?所谓三层结构,不是物理上的三层划分,也不是简单的模块划分,而是逻辑上的三层,是在客户端和数据库访问之间加入了一个中间层,形成逻辑三层结构。

             三层都是哪三层?它们的作用是什么?三层结构包含:表示层UI,业务逻辑层BLL,数据访问层DAL1 显示层,就是软件的显示部分,主要是客户端,通常表现为WEB或窗体。主要功能:接受用户输入信息、显示系统输出信息、为用户提供一个交互界面。 2 业务逻辑层,系统主要功能部分,主要处理软件的业务逻辑,处理数据。 3 数据访问层,用于对数据库的操作,但不是数据库。

             为什么要使用三层?设计模式告诉我们,软件设计开发要遵循开放--封闭原则,也就是说一款软件可以增加功能或代码,但是不能修改。使用三层结构以前,显示层、业务逻辑层、数据访问层都是耦合在一起的,如果我们需要变动客户端的内容,那么业务逻辑层就必须要改动,这是不安全的,所以我们需要把业务逻辑层单独处理,以减少它们之间的耦合。

            以一个简单的登录示例来介绍三层的具体实现。看一下三层之间的关系图:

     

    三层之间通过传递参数进行联系,如果参数过多,会使程序变得复杂化,这里我们引入实体来进行参数传递,同时数据库应该独立于数据访问层而存在,关系图需要改进,改进后的关系图如下:

    sqlhelper用于封装数据库连接语句,属于DAL层):


               主窗体展示:


               看一下各层的代码是如何实现各自功能的。U层代码:

     

    [csharp] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
    1. namespace LoginUI  
    2. {  
    3.     public partial class Form1 : Form  
    4.     {  
    5.         public Form1()  
    6.         {  
    7.             InitializeComponent();  
    8.         }  
    9.   
    10.         private void btnOK_Click(object sender, EventArgs e)     //双击事件  
    11.         {  
    12.             Login.Model.UserInfo user1 = new Login.Model.UserInfo();        //使用实体传递数据  
    13.             user1.UserName = txtUserName.Text.Trim();  
    14.             user1.Password = txtPassword.Text.Trim();  
    15.   
    16.             Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();          //定义一个业务逻辑类  
    17.   
    18.             Login.Model.UserInfo user4 = mgr.UserLogin(user1);      //定义实体存放登录结果(逻辑层比较结果)  
    19.             if (user4 == null)  
    20.             {  
    21.                 MessageBox.Show("信息不正确");               //账号或密码不正确  
    22.             }  
    23.             else  
    24.             {  
    25.                 MessageBox.Show("登录用户" + user1.UserName);   //登录  
    26.             }                  
    27.         }  
    28.     }  
    29. }  

             U层代码要实现两个功能,获得用户输入信息和显示系统输出信息,我们使用user1获得用户输入信息,使用user4获得B层的下层反馈信息,并且最后显示系统登录内容。U层没有任何的系统逻辑事物处理,也没有和数据库直接联系,降低了系统耦合度。

             D层代码:

     

    [csharp] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
    1. namespace Login.DAO  
    2. {  
    3.     public class UserDAO             //用户数据操作类  
    4.     {  
    5.         public Login.Model.UserInfo  SelectUser(Login.Model.UserInfo user1)         //使用user1为参数连接数据库  
    6.         {  
    7.             string ConnString = @"Server=GE-PC;Database=Login;User=sa;Password=123456;";        //数据库连接字段  
    8.             using (SqlConnection conn = new SqlConnection (ConnString ))               //连接数据库  
    9.             {  
    10.                 SqlCommand cmd = conn.CreateCommand();                              //  
    11.                 cmd.CommandText = @"SELECT UserName, PassWord  
    12.                                     FROM USERS  
    13.                                     WHERE UserName=@UserName AND Password=@Password";  
    14.                 cmd.CommandType = CommandType.Text;                             //  
    15.                 cmd.Parameters.Add(new SqlParameter ("@UserName",user1.UserName));       //用户名  
    16.                 cmd.Parameters.Add(new SqlParameter ("@Password",user1.Password));         //密码  
    17.                 conn.Open();  
    18.                 SqlDataReader reader = cmd.ExecuteReader();                         //  
    19.   
    20.                 Login.Model.UserInfo user2 = new Login.Model.UserInfo();            //连接数据库获得数据放到user2  
    21.                 while(reader.Read())                    //  
    22.                 {  
    23.                     user2.UserName = reader.GetString(0).ToString().Trim();              //  
    24.                     user2.Password = reader.GetString(1).ToString().Trim ();  
    25.                 }  
    26.                 return user2;                          //返回user2  
    27.   
    28.             }  
    29.         }  
    30.     }  
    31. }  

             D层代码主要功能是根据上层需要,连接数据库,操作数据库返回信息。这一层我们使用user2存放数据库信息并且把数据返回上一层,这里也没有任何的系统业务逻辑处理,只有对数据库操作。

            最后看看B层是如何实现系统功能的:

    [csharp] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
    1. namespace Login.BLL  
    2. {  
    3.     public class LoginManager  
    4.     {  
    5.         public UserInfo UserLogin(Login.Model.UserInfo user1)  
    6.         {  
    7.             Login.DAO.UserDAO uDao = new Login.DAO.UserDAO();              //实例化用户数据操作类            
    8.             Login.Model.UserInfo user3 = uDao.SelectUser(user1);        //             
    9.   
    10.             if (user3.UserName!=user1.UserName ||user3.Password!=user1.Password)             //判断账号密码是否正确  
    11.             {  
    12.                 return null;          //信息不正确  
    13.             }  
    14.             else  
    15.             {  
    16.                 return user3;           //返回数据库内容  
    17.             }  
    18.              
    19.         }  
    20.     }  
    21. }  

             B层主要就是实现系统的逻辑功能,这里使用U层的user1来存放登录的用户名和密码,使用user3来存放数据库中的用户名和密码,然后判断是否相同,实现登录功能,最后把判断结构返回到U层来显示出来。

             运行结果:


             三层解决了数据显示和数据库的耦合问题,使软件的可维护性和灵活性增强。但是三层的使用,是系统更加复杂,对软件的有效性提出了考研。三层不是万能的,需要谨慎使用。

  • 相关阅读:
    Linux常用命令-centos
    USACO 2006 Open, Problem. The Country Fair 动态规划
    USACO 2007 March Contest, Silver Problem 1. Cow Traffic
    USACO 2007 December Contest, Silver Problem 2. Building Roads Kruskal最小生成树算法
    USACO 2015 February Contest, Silver Problem 3. Superbull Prim最小生成树算法
    LG-P2804 神秘数字/LG-P1196 火柴排队 归并排序, 逆序对
    数据结构 并查集
    浴谷国庆集训 对拍
    1999 NOIP 回文数
    2010 NOIP 普及组 第3题 导弹拦截
  • 原文地址:https://www.cnblogs.com/fengyv/p/3789328.html
Copyright © 2011-2022 走看看