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

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

            三层都是哪三层?它们的作用是什么?三层结构包括:表示层UI,业务逻辑层BLL,数据訪问层DAL1显示层,就是软件的显示部分。主要是client,通常表现为WEB或窗口。

    主要功能:接受用户输入信息、显示系统输出信息、为用户提供一个交互界面。 2 业务逻辑层,系统主要功能部分。主要处理软件的业务逻辑,处理数据。 3数据訪问层,用于对数据库的操作。但不是数据库。

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

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

     

    三层之间通过传递參数进行联系,假设參数过多,会使程序变得复杂化,这里我们引入实体来进行參数传递,同一时候数据库应该独立于数据訪问层而存在,关系图须要改进。改进后的关系图例如以下:

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


               解决方式:


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

    namespace LoginUI
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void btnOK_Click(object sender, EventArgs e)     //双击事件
            {
                Login.Model.UserInfo user1 = new Login.Model.UserInfo();        //使用实体传递数据
                user1.UserName = txtUserName.Text.Trim();
                user1.Password = txtPassword.Text.Trim();
    
                Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();          //定义一个业务逻辑类
    
                Login.Model.UserInfo user4 = mgr.UserLogin(user1);      //定义实体存放登录结果(逻辑层比較结果)
                if (user4 == null)
                {
                    MessageBox.Show("信息不对");               //账号或password不对
                }
                else
                {
                    MessageBox.Show("登录用户" + user1.UserName);   //登录
                }                
            }
        }
    }
             U层代码要实现两个功能,获得用户输入信息和显示系统输出信息,我们使用user1获得用户输入信息。使用user4获得B层的下层反馈信息,而且最后显示系统登录内容。U层没有不论什么的系统逻辑事物处理,也没有和数据库直接联系,减少了系统耦合度。

             D层代码:

    namespace Login.DAO
    {
        public class UserDAO             //用户数据操作类
        {
            public Login.Model.UserInfo  SelectUser(Login.Model.UserInfo user1)         //使用user1为參数连接数据库
            {
                string ConnString = @"Server=GE-PC;Database=Login;User=sa;Password=123456;";        //数据库连接字段
                using (SqlConnection conn = new SqlConnection (ConnString ))               //连接数据库
                {
                    SqlCommand cmd = conn.CreateCommand();                              //
                    cmd.CommandText = @"SELECT UserName, PassWord
                                        FROM USERS
                                        WHERE UserName=@UserName AND Password=@Password";
                    cmd.CommandType = CommandType.Text;                             //
                    cmd.Parameters.Add(new SqlParameter ("@UserName",user1.UserName));       //username
                    cmd.Parameters.Add(new SqlParameter ("@Password",user1.Password));         //password
                    conn.Open();
                    SqlDataReader reader = cmd.ExecuteReader();                         //
    
                    Login.Model.UserInfo user2 = new Login.Model.UserInfo();            //连接数据库获得数据放到user2
                    while(reader.Read())                    //
                    {
                        user2.UserName = reader.GetString(0).ToString().Trim();              //
                        user2.Password = reader.GetString(1).ToString().Trim ();
                    }
                    return user2;                          //返回user2
    
                }
            }
        }
    }
             D层代码主要功能是依据上层须要,连接数据库。操作数据库返回信息。这一层我们使用user2存放数据库信息而且把数据返回上一层,这里也没有不论什么的系统业务逻辑处理,仅仅有对数据库操作。

            最后看看B层是怎样实现系统功能的:

    namespace Login.BLL
    {
        public class LoginManager
        {
            public UserInfo UserLogin(Login.Model.UserInfo user1)
            {
                Login.DAO.UserDAO uDao = new Login.DAO.UserDAO();              //实例化用户数据操作类          
                Login.Model.UserInfo user3 = uDao.SelectUser(user1);        //           
    
                if (user3.UserName!=user1.UserName ||user3.Password!=user1.Password)             //推断账号password是否正确
                {
                    return null;          //信息不对
                }
                else
                {
                    return user3;           //返回数据库内容
                }
               
            }
        }
    }
             B层主要就是实现系统的逻辑功能,这里使用U层的user1来存放登录的username和password,使用user3来存放数据库中的username和password,然后推断是否同样。实现登录功能,最后把推断结构返回到U层来显示出来。

             执行结果:


             三层攻克了数据显示和数据库的耦合问题。使软件的可维护性和灵活性增强。可是三层的使用,是系统更加复杂,对软件的有效性提出了考研。

    三层不是万能的,须要慎重使用。

  • 相关阅读:
    聊一聊所谓的B端C化
    NetCore3.1IIS其他网站出现HTTP503无法访问解决办法
    技术方案模板 fn
    技术方案模板
    composer的常用操作(composer 2.2.1)
    thinkphp6: 用validate验证参数合法性(thinkphp 6.0.9/php 8.0.14)
    thinkphp6: 从6.0.9升级(php 8.0.14)到 6.0.10lts版本(php 8.1.1)
    thinkphp6: 自定义配置文件(php 8.1.1 / thinkphp v6.0.10LTS)
    linux(ubuntu21.10):为chrome安装jsonvue(chrome 96)
    thinkphp6:mysql数据库使用事务(php 8.1.1 / thinkphp v6.0.10LTS)
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5217636.html
Copyright © 2011-2022 走看看