三层架构—简析

    三层学习完了,第一次验收的时候,自己理解的也不是非常到位,后来又又一次敲了一遍登陆样例,查阅了一些资料

进行第二次验收才感觉清晰了很多。之前画时序图时我就想过时序图基本上也是非常好的体现了三层,当时也和别人讨

论过这个问题。

直到学完三层后,更加证明了这一点。

    以下我将从理论和实践两个角度总结一下三层。


理论篇


    为什么使用三层架构?


    说白了,分层的目的是想将复杂问题简单化,也就是面向对象技术所崇尚的“高内聚,低耦合”。当业务复杂到

一定程度。数据存储在独立的存储介质时适合用三层架构。


    什么是三层架构?


    通常意义上的三层架构(3-tier architecture)就是将整个业务应用划分为:表现层(UI)、业务逻辑层

(BLL)、数据訪问层(DAL)。

    图解



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

    业务逻辑层(BLL):连接UI和DAL的桥梁。

    数据訪问层(DAL):实现数据库的增、删、改、查。

    实体类(Model):不属于三层的范畴,个人理解的建立实体类的目的是将加载的数据库中的数据放入当中,

UI、BLL、DAL。哪个须要就从实体类中获取。封装数据,避免了传參数造成的复杂,从而避免了各个层与数据库的直

接接触,造成数据交叉。各个层仅仅须要和实体层Model打交道就可以。

    点睛

    各个层各司其职,仅仅负责自己专属的功能。提高了内聚性,降低了彼此之间的耦合。Model是数据传输的业务数

据模型,不是数据库中的数据。Model是避免出现数据交而建立的。


    怎样搭建?


    优缺点?


    长处

        1、开发者能够仅仅关注整个结构中的当中某一层。

        2、能够减少层与层之间的依赖;

        3、有利于标准化,能够非常easy的用新的实现来替换原有层次的实现。

        4、在后期维护的时候,极大地减少了维护成本和维护时间

    缺点

        1、减少了系统的性能。这是不言而喻的。假设不採用分层式结构。非常多业务能够直接造訪数据库,以此获

取对应的数据。现在却必须通过中间层来完毕。

        2、有时会导致级联的改动。这样的改动尤其体如今自上而下的方向。

假设在表示层中须要添加一个功能。为

保证其设计符合分层式结构,可能须要在对应的业务逻辑层和数据訪问层中都添加对应的代码。

        3、添加了开发成本。


实战篇


    以下是一个登录窗口的DEMO


    UI层的代码


<span style="font-family:KaiTi_GB2312;font-size:18px;">namespace LoginUI
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void btnLogin_Click(object sender, EventArgs e){string userName = txtUserName.Text.Trim();   string password = txtPassword.Text;Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();   //重载BLL层Login.Model.UserInfo user = mgr.UserLogin(userName, password);MessageBox.Show("登录用户:" + user.UserName);}}
}
</span>

    UI层,人机交互。须要引用BLL和Model层,从代码中能够看出UI层不包括不论什么逻辑推断的代码和跟数据库有关的

代码。


    BLL层的代码


<span style="font-family:KaiTi_GB2312;font-size:18px;">namespace Login.BLL
{public class LoginManager{public Login.Model.UserInfo UserLogin(string userName, string password)      //获得Model中封装的数据库中的数据(UI层中的){Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();        //实例化UserDAO类Login.Model.UserInfo user = uDao.SelectUser(userName, password);           if (user != null)                                          // 加载成功{Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO();             //知道数据库连接成操作命令sDao.UpdateScore(userName, 10);return user;}else{throw new Exception("登录失败。");}
</span>

    从代码中能够看出BLL层也不和数据库打交道,没有SQL语句。

须要引用DAL和Model层。


    DAL层代码


<span style="font-family:KaiTi_GB231<span style="font-family: Arial, Helvetica, sans-serif;">2;font-size:18px;">namespace Login.DAL</span>
{public class UserDAO{public Login.Model.UserInfo SelectUser(string userName, string password)    //获取Model中的表中的数据,返回的是数据模型{using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))      //建立数据库连接{SqlCommand cmd = conn.CreateCommand();  //表示要对 SQL Server 数据库运行的一个 Transact-SQL 语句或存储过程。

实例化一个接口,用以运行SQL指令 cmd.CommandText = @"SELECT ID, UserName, Password,Email FROM USERS WHERE UserName=@UserName AND Password=@Password"; cmd.CommandType = CommandType.Text; cmd.Parameters.Add(new SqlParameter("@UserName",userName)); //添加上面数据库连接中设的两个參数 cmd.Parameters.Add(new SqlParameter("@Password",password)); conn.Open(); //打开数据库 SqlDataReader reader = cmd.ExecuteReader(); Login.Model.UserInfo user = null; //默认值是Null while (reader.Read()) //读取数据库中的数据 { if (user == null) { user = new Login.Model.UserInfo(); //当Model是Null的话才载入数据 } user.ID = reader.GetInt32(0); user.UserName = reader.GetString(1); user.Password = reader.GetString(2); if (!reader.IsDBNull(3)) //假设Email不是Null的话,才干读取 { user.Email = reader.GetString(3); } } return user; } } } } </span>


    从代码中能够看出是直接和数据库打交道的,没有跟窗口控件有关的内容。须要引入Model层。


个人小结


    分层的目标是为了“高内聚。低耦合”。分层可将复杂的简单化。当需求须要改变时,你仅仅须要该对应部分而不

用大范围的改动。分层还提高了可维护性和可扩展性,但并非全部的都要分层,业务逻辑简单,没有真正的数据存

储层这时就不须要分层,假设分层反而会添加复杂度。所以我们寻常在使用时要注意灵活应用。



转载于:https://www.cnblogs.com/blfbuaa/p/7241251.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429027.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机房收费系统之结账

其实&#xff0c;我认为机房收费系统中结账的部分是耗我精力最多的。首先我就不明确结账是干嘛的&#xff0c;所以一上来就晕乎乎。后来看了一篇博客说结账方便老板管理的才明确了为什么是“操作员”。这里面要理清的一点&#xff0c;结账的内容是未结账的。 暂时汇总的信息&am…

Java线上应用故障排查之一:高CPU占用

一个应用占用CPU很高&#xff0c;除了确实是计算密集型应用之外&#xff0c;通常原因都是出现了死循环。 以我们最近出现的一个实际故障为例&#xff0c;介绍怎么定位和解决这类问题。 根据top命令&#xff0c;发现PID为28555的Java进程占用CPU高达200%&#xff0c;出现故障。 …

Java并发编程实战 代码bug,Java并发编程实战(1)- 并发程序的bug源头

概述并发编程一般属于编程进阶部分的知识&#xff0c;它会涉及到很多底层知识&#xff0c;包括操作系统。编写正确的并发程序是一件很困难的事情&#xff0c;由并发导致的bug&#xff0c;有时很难排查或者重现&#xff0c;这需要我们理解并发的本质&#xff0c;深入分析Bug的源…

ajax小结

转载于:https://www.cnblogs.com/infernoyy/p/7250548.html

app推送以及提示音java,springboot 整合 Jpush 极光推送

产品简介&#xff1a;JPush 是经过考验的大规模 App 推送平台&#xff0c;每天推送消息数超过 5 亿条。 开发者集成 SDK 后&#xff0c;可以通过调用 API 推送消息。同时&#xff0c;JPush 提供可视化的 web 端控制台发送通知&#xff0c;统计分析推送效果。 JPush 全面支持 An…

Lydsy2017年4月月赛 抵制克苏恩

Description小Q同学现在沉迷炉石传说不能自拔。他发现一张名为克苏恩的牌很不公平。如果你不玩炉石传说&#xff0c;不必担心&#xff0c;小Q同学会告诉你所有相关的细节。炉石传说是这样的一个游戏&#xff0c;每个玩家拥有一个30 点血量的英雄&#xff0c;并且可以用牌召唤至…

怎样学习(3):迭代学习,精益求精

古人云「十年寒窗无人问。一举成名天下知」&#xff0c;这是中国古代为数不多的读书人的真实写照。大多数读书人仅仅有十年寒窗&#xff0c;却不见得成名。 在软件开发领域有瀑布模式的软件project方法论。它将软开发的几个过程「需求分析&#xff0c;概要设计&#xff0c;具体…

matlab宏参赛,MATLAB杯无人机大赛 | 决赛通知!

原标题&#xff1a;MATLAB杯无人机大赛 | 决赛通知&#xff01;重磅消息——决赛通知&#xff01;经过近5个多月的准备&#xff0c;MATLAB杯无人机比赛即将迎来精彩的决赛&#xff0c;来自全国10强的参赛队伍&#xff0c;齐聚羊城广州&#xff0c;美丽的中山大学&#xff0c;进…

php表格js特效,JavaScript表格隔行变色和Tab标签页特效示例【附jQuery版】

本文实例讲述了JavaScript表格隔行变色和Tab标签页特效。分享给大家供大家参考&#xff0c;具体如下&#xff1a;最近一直在看JavaScript知识&#xff0c;偶尔也穿插一点Jquery&#xff0c;感觉Jquery用起来真爽&#xff0c;减少了很多的代码量&#xff0c;而且学习也不是很高。…

java实现gdal栅格矢量化,《GDAL源码剖析与开发指南》一一1.5 GDAL源码目录

本节书摘来自异步社区出版社《GDAL源码剖析与开发指南》一书中的第1章&#xff0c;第1.5节&#xff0c;作者&#xff1a;李民录 更多章节内容可以访问云栖社区“异步社区”公众号查看。1.5 GDAL源码目录GDAL源码剖析与开发指南下载的GDAL源代码压缩包目录如图1-2所示&#xff0…

netlify支持php吗,hexo netlify 搭建简易博客

npm install hexo-cli -ghexo init blogcd blognpm installhexo server将本地文件夹推送到github修改主题git clone https://github.com/jangdelong/hexo-theme-xups.git themes/xups themes/xups修改yml配置文件重新hexo server自己的博客sleepy-poincare-e0ca11.netlify.c…

jps、jstack、jmap、jhat、jstat、hprof使用详解

https://my.oschina.net/feichexia/blog/196575#comment-list A、 jps(Java Virtual Machine Process Status Tool) jps主要用来输出JVM中运行的进程状态信息。语法格式如下&#xff1a; 如果不指定hostid就默认为当前主机或服务器。 命令行参数选项说明如下&#xff1a;…

oracle数据库日期格式的运算,Oracle时间类型date,timestamp时间差计算

Oracle的时间类型有两种date和timestamp. date精确到秒,timestamp精确到毫秒.1.计算date类型的时间差可以先把年,月,日,小时,分,秒用to_char函数拆分出来,再用to_number函数转换成数值类型.有了这些单独分开的时间就好办了.就再一个个的去减,记得考虑单位换算就行.比如都转换…

url去除掉一个参数php,php怎样去掉url中的参数_后端开发

php去掉url中的参数的要领是&#xff1a;能够经由过程trim()函数来完成。该函数能够删除字符串中的指定字符&#xff0c;并返回已修正的字符串。细致使用要领如&#xff1a;【trim($url,"?");trim($url,"#");】。相干函数引见&#xff1a;(引荐教程&#…

C++之类的静态成员变量和静态成员函数

static静态成员函数 在类中。static 除了声明静态成员变量&#xff0c;还能够声明静态成员函数。普通成员函数能够訪问全部成员变量。而静态成员函数仅仅能訪问静态成员变量。我们知道。当调用一个对象的成员函数&#xff08;非静态成员函数&#xff09;时&#xff0c;系统会把…

使用VS Code开发.Net Core 2.0 MVC Web应用程序教程之一

好吧&#xff0c;现在我们假设你已经安装好了VS Code开发工具、.Net Core 2.0预览版的SDK dotnet-sdk-2.0.0&#xff08;注意自己的操作系统&#xff09;&#xff0c;并且已经为VS Code安装好了C#扩展&#xff08;在VS Code的扩展菜单中输入OmniSharp&#xff0c;安装扩展即可&…

WPF--TextBlock的ToolTip附加属性

大家可能在项目中&#xff0c;有的时候&#xff0c;由于显示的内容过长&#xff0c;所以&#xff0c;需要显示一部分内容&#xff0c;然后后面用省略号&#xff0c;把鼠标放上去&#xff0c;会显示出来全部的内容。 作为一个LowB程序员的我&#xff0c;第一反应是SubString截取…

Laravel框架一:原理机制篇

转载自http://www.cnblogs.com/XiongMaoMengNan/p/6644892.htmlLaravel作为在国内国外都颇为流行的PHP框架&#xff0c;风格优雅&#xff0c;其拥有自己的一些特点。 一. 请求周期 Laravel 采用了单一入口模式&#xff0c;应用的所有请求入口都是 public/index.php 文件。 注册…

Linux高频命令汇总,Linux高频命令

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;findfind path [options] params作用&#xff1a;在指定目录下查找文件1234find / -name "target.java" #在根目录下查找target.java文件find -name &qu…

linux系统时间函数,Linux时间时区详解与常用时间函数

时间与时区整个地球分为二十四时区&#xff0c;每个时区都有自己的本地时间。UTC时间 与 GMT时间我们可以认为格林威治时间就是时间协调时间(GMT UTC)&#xff0c;格林威治时间和UTC时间都用秒数来计算的。UTC时间与本地时间UTC 时区差 本地时间时区差东为正&#xff0c;西为…