惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

腾讯CDC
Hacker News: Ask HN
Hacker News: Ask HN
S
Securelist
Security Latest
Security Latest
S
Schneier on Security
T
Threat Research - Cisco Blogs
Latest news
Latest news
Cyberwarzone
Cyberwarzone
A
Arctic Wolf
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
NISL@THU
NISL@THU
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
I
Intezer
T
The Exploit Database - CXSecurity.com
N
News and Events Feed by Topic
Simon Willison's Weblog
Simon Willison's Weblog
T
Tor Project blog
Blog — PlanetScale
Blog — PlanetScale
C
Cyber Attacks, Cyber Crime and Cyber Security
C
CERT Recently Published Vulnerability Notes
The Hacker News
The Hacker News
月光博客
月光博客
WordPress大学
WordPress大学
博客园 - 叶小钗
Hugging Face - Blog
Hugging Face - Blog
美团技术团队
量子位
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Cisco Blogs
博客园 - 三生石上(FineUI控件)
Google DeepMind News
Google DeepMind News
Project Zero
Project Zero
Webroot Blog
Webroot Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Application and Cybersecurity Blog
Application and Cybersecurity Blog
云风的 BLOG
云风的 BLOG
L
LINUX DO - 最新话题
Schneier on Security
Schneier on Security
Engineering at Meta
Engineering at Meta
www.infosecurity-magazine.com
www.infosecurity-magazine.com
aimingoo的专栏
aimingoo的专栏
D
Docker
有赞技术团队
有赞技术团队
Google DeepMind News
Google DeepMind News
宝玉的分享
宝玉的分享
T
Troy Hunt's Blog
L
Lohrmann on Cybersecurity
T
The Blog of Author Tim Ferriss
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
L
LangChain Blog

博客园 - fengyv

塑造职场影响力的五大法宝 怎样培养独挡一面的能力 数据结构 - 归并排序(merging sort) [分享]恼人的设计模式 Git使用总结 设计师整理的系统开发流程-简洁又有重点 JavaScript中的String对象 python高效解析日志入库 如何让js不产生冲突,避免全局变量的泛滥,合理运用命名空间 HTML CSS——margin和padding的学习 C语言的代码内存布局详解 超级立方体小记 如何和项目经理沟通产品的交付? CentOS配置smaba与Windows共享文件 Javascript实现简单的下拉二级菜单 从测试员到测试负责人 项目团队中4种组员类型的相应管理方式 在软件项目管理中如何把时间估算的靠近真实值? 性能优化——算法优化
三层浅析及示例分析
fengyv · 2014-06-15 · via 博客园 - fengyv

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

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

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

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

 

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

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


           主窗体展示:


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

  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层代码:

  1. namespace Login.DAO  
  2. {  
  3.     public class UserDAO               
  4.     {  
  5.         public Login.Model.UserInfo  SelectUser(Login.Model.UserInfo 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();              
  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;                            
  27.   
  28.             }  
  29.         }  
  30.     }  
  31. }  

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

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

  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层来显示出来。

         运行结果:


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