经典三层 变 七层

2024-08-26 18:38
文章标签 经典 三层 七层

本文主要是介绍经典三层 变 七层,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

机房总结

虽然自己的笔记还没有整理成博客,但是,我认为,作为第一遍重构完成的咱,首先要先写一下对机房整体的认知。

首先说这个三层 OR 七层

当时,话说是一个多月前,刚刚把三层的登陆实现,霍霍师傅来查看我的劳动成果,十分大方的表扬了我几句,后来给我说了一句话,我懵了——“你是打算先敲三层然后再转七层?还是直接用七层啊?”  我滴个乖乖,三层还没弄懂,怎么又出来个七层?什么是七层啊?什么又是三层啊?

皇天不负有心人,经过玉洋师傅的细心指导以及霍霍师傅的不厌其烦,我明白了

三层图:


 

这就是三层,看着怎么有四个啊?这是我的疑问!后来知道了,三层,主要分的是UIBLLDAL这三层,而实体层呢(Entity),是为了给三层解耦的,而整个三层都是为了给我们第一遍机房解耦来的

 

七层图:


这就是七层,貌似,我看到的是八层! 没错,你眼前的的这个SqlHelper,因为只有DAL引用他,所以有的人(我)就把它直接放在D层,作为了一个类,用来封装我们DAL层每个方法都要用到的几种SQL语句,果不其然,省了不少的事啊! 所以显而易见,所谓的七层,就是在三层的基础上加上了外观(Facade),接口(IDAL),工厂(Factory)

 至于他们有什么用,咱们一会再说吧


那,咱们首先来看一下三层吧!

由上面的三层架构图大家应该就可以看出来作为显示层的UI和数据处理层的DAL是没有直接交互的,他们之间的所有联系都是由逻辑处理层BLL为枢纽进行的,就拿登陆来说:

1:在UI界面上输入自己的用户名和密码(然后把该相应的值赋给相应的实体)

2:根据实体层中相应实体的值作为条件DAL层去运用sql语句在数据库中进行查找,然后返回结果

3:接着就是Bll逻辑处理层的事了,BLL接受来自DAL返回的数据和UI传进来的数据进行处理,根据不同的条件返回给UI不同的答复,而这种返回时怎么实现的呢?就是自己为他们精心准备的方法Function,如例:

http://blog.csdn.net/liweizhong193516/article/details/43232215(vb.net实现三层登陆)

有了上面三层的底子,我们再来介绍七层就太简单了

同样,看上面七层的架构图,大家肯定会发现,其实UI和BLL和DAL和Entity的位置没有什么变化,只是在UI和BLL之间加上了Facade(外观),在BLL和DAL之间创建了一个接口IDAL,在外,又加了一个工厂,仅此而已。

首先我们说说外观Facade有什么用呢?

大家都学过设计模式了,大话设计模式里面的外观模式有什么用呢?————为子系统中的一组接口提供一个一致的界面

同样,我们这里的外观就是应用的设计模式,所以作用是相同的,将几个或者是N多个可以同时出现的东西统一起来,一起出现,省时省力啊,打个比方就比如你家一共有横排32盏灯,如果没一盏灯都有一个开关的话,那如果全开或者全关就得累死,所以,我们按了一个统一的开关,一按全开,一按全关(据实际情况而定)


只不过呢,在我的运用中,感觉外观用的不是很好,因为每个功能相对来说都比较独立,没有那么强的联系性,所以这个就没有代码展示了



我们再说说这个工厂吧,Factory+反射

Imports System.Configuration    '添加对配置文件的引用  
Imports System.Reflection       '添加对反射的引用  
Imports IDALPublic Class sqlFactory将D层中的每个类都对应在配置文件中的Key值,下面只应用这个Key值就可以应用D层的类。这样D层的变化就不会修改FactoryDim strUSER As String = System.Configuration.ConfigurationSettings.AppSettings("strUSER")Public Function CreateIUser() As IUserInfoReturn CType(Assembly.Load("DAL").CreateInstance("DAL" & "." & strUSER), IUserInfo)End FunctionDim strWL As String = System.Configuration.ConfigurationSettings.AppSettings("strWL")''' <summary>''' 工作记录工厂''' </summary>''' <returns></returns>''' <remarks></remarks>Public Function CreateIWorkLog() As IWorkLogReturn CType(Assembly.Load("DAL").CreateInstance("DAL" & "." & strWL), IWorkLog)End Function'Dim strOnWL As String = System.Configuration.ConfigurationSettings.AppSettings("strOnWL")' ''' <summary>' ''' 正在工作工厂' ''' </summary>' ''' <returns></returns>' ''' <remarks></remarks>'Public Function CreateIOnWorkLog() As IWorkLog'    Return CType(Assembly.Load("DAL").CreateInstance("DAL" & "." & strOnWL), IWorkLog)'End Function''' <summary>'''  学生工厂''' </summary>''' <remarks></remarks>Dim strStudent As String = System.Configuration.ConfigurationSettings.AppSettings("strStudent")Public Function CreateISdtudent() As IStudentInfoReturn CType(Assembly.Load("DAL").CreateInstance("DAL" & "." & strStudent), IStudentInfo)End Function''' <summary>''' 注册工厂''' </summary>''' <remarks></remarks>Dim strCard As String = System.Configuration.ConfigurationManager.AppSettings("strCard")Public Function CreateIRegist() As IStudentInfoReturn CType(Assembly.Load("DAL").CreateInstance("DAL" & "." & strCard), IStudentInfo)End Function''' <summary>''' 定义D层数据设定表的配置文件相连''' </summary>''' <remarks></remarks>Dim strBasicData As String = System.Configuration.ConfigurationSettings.AppSettings("strBasicData")Public Function CreateIBasicData() As IDataBasicReturn CType(Assembly.Load("DAL").CreateInstance("DAL" & "." & strBasicData), IDataBasic)End Function' ''' <summary>' ''' 组合查询的工厂' ''' </summary>' ''' <remarks></remarks>'Dim strCombiStudentDB As String = System.Configuration.ConfigurationSettings.AppSettings("strCombiStudentDB")'Public Function CreateICombination() As ICombination'    Return CType(Assembly.Load("DAL").CreateInstance("DAL" & "." & strCombiStudentDB), ICombination)'End Function''' <summary>''' 充值工厂''' </summary>''' <remarks></remarks>Dim strRecharge As String = System.Configuration.ConfigurationSettings.AppSettings("strRecharge")Public Function CreateIRecharge() As IRechargeInfoReturn CType(Assembly.Load("DAL").CreateInstance("DAL" & "." & strRecharge), IRechargeInfo)End Function''' <summary>''' 退卡工厂''' </summary>''' <remarks></remarks>Dim strBackCard As String = System.Configuration.ConfigurationSettings.AppSettings("strBackCard")Public Function CreateIBackCard() As ICancelCardInfoReturn CType(Assembly.Load("DAL").CreateInstance("DAL" & "." & strBackCard), ICancelCardInfo)End Function''' <summary>''' 正在上机查询工厂''' </summary>''' <remarks></remarks>Dim strOnLine As String = System.Configuration.ConfigurationSettings.AppSettings("strOnLine")Public Function CreateIOnLine() As IOnLineInfoReturn CType(Assembly.Load("DAL").CreateInstance("DAL" & "." & strOnLine), IOnLineInfo)End Function''' <summary>''' 上下机记录工厂''' </summary>''' <remarks></remarks>Dim strOnOffLine As String = System.Configuration.ConfigurationSettings.AppSettings("strOnOffLine")Public Function CreateIOnOffLine() As ILineLogReturn CType(Assembly.Load("DAL").CreateInstance("DAL" & "." & strOnOffLine), ILineLog)End Function''' <summary>''' 结账工厂''' </summary>''' <remarks></remarks>Dim strSettleAccountDAL As String = System.Configuration.ConfigurationSettings.AppSettings("strSettleAccountDAL")Public Function CreateISettleAccount() As ICheckReturn CType(Assembly.Load("DAL").CreateInstance("DAL" & "." & strSettleAccountDAL), ICheck)End Function
End Class


这个是我们的app配置文件

 <add name="UI.My.MySettings.MyChargeConnectionString" connectionString="Data Source=liweizhong;Initial Catalog=ReCharge_sys;User ID=sa;Password=li"providerName="System.Data.SqlClient" /></connectionStrings><startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /></startup><appSettings><clear/><add key="connString"  value="server=liweizhong;database=ReCharge_sys;uid=sa;password=li;" /><add key="strUSER" value="UserInfoDAO" /><add key="strWL" value="WorkLogDAO" /><add key="strOnWL" value="OnWorkLogDAO" /><add key="strStudent" value="StudentInfoDAO" /><add key="strCard" value="StudentInfoDAO" /><add key="strBasicData"  value="DataBasicDAO" /><add key="strCombiStudentDB"  value="CombinationDAO" /><add key="strRecharge"  value="RechargeInfoDAO" /><add key="strBackCard"  value="CancelCardInfoDAO" /><add key="strOnLine"  value="OnLineInfoDAO" /><add key="strOnOffLine"  value="LineLogDAO" /><add key="strSettleAccountDAL"  value="CheckDAO" /></appSettings>
</configuration>

通过上面大家可以看到什么呢?首先是工厂里面,一个个的小工厂,什么学生工厂啊,用户工厂什么的,想想设计模式里的工厂方法,应该理解不少吧。更加重要的来了,反射

大家可以看到,在配置文件里,各种各样的  Key     value   ,key是什么呢?钥匙?No,key是关键字,关键字又是在哪儿呢?看看工厂吧,这下大家明白了吧,在工厂里面定义关键字,确定该类要用的接口类,而转到UI层中的app配置文件中,根据关键字的不同来确定去拜访那个DAL,更加明显的的就是去看看操作哪张表。

其中值得一讲的是DAL的编译路径,要放到UI层上,不然会报错的哦,为什么呢?一头一尾总要在一条线上是吧


接口大家就很容易接受了吧,将DAL中的各个方法写好之后,不与外界联系,如果有谁要调用某个D层中的方法,就要调用IDAL中的接口,接口控制方法的使用,这样的话,如果感觉那个方法写得不好了或者不对,就不用每个层都改了,直接改D层就好了。

Public Interface IStudentInfo‘学生 接口Function StudentLogin(ByVal Stu As Entity.StudentInfoEntity) As List(Of Entity.StudentInfoEntity) '学生登陆接口Function SelectStudentInfo(ByVal Stu As Entity.StudentInfoEntity) As List(Of Entity.StudentInfoEntity) '选择学生接口Function ChangePWD(ByVal Stu As Entity.StudentInfoEntity) As Integer '修改学生密码接口Function Online(ByVal Stu As Entity.StudentInfoEntity) As Integer '查看在线学生接口Function UpdateCash(ByVal Stu As Entity.StudentInfoEntity) As Integer '更新学生卡上余额接口
End Interface

而D层中呢,都有一个相应的方法与之对应

Public Class StudentInfoDAO : Implements IDAL.IStudentInfoPrivate SQLHelper As DAL.SQLhelper = New DAL.SQLhelper()Public Function StudentLogin(Stu As Entity.StudentInfoEntity) As List(Of Entity.StudentInfoEntity) Implements IStudentInfo.StudentLoginDim List As New List(Of Entity.StudentInfoEntity)Dim table As DataTableDim sql As StringDim sqlParams As SqlParameter() = {New SqlParameter("@IDcard", Stu.IDcard), New SqlParameter("@StuPWD", Stu.StuPWD)}sql = "select * from StudentInfo where IDcard=@IDcard and StuPWD=@StuPWD"table = SQLHelper.ExecSelect(sql, CommandType.Text, sqlParams)If table.Rows.Count > 0 ThenList = ConvertListDAL.convertToList(Of Entity.StudentInfoEntity)(table)Return ListElseReturn NothingEnd IfEnd FunctionPublic Function SelectStudentInfo(Stu As Entity.StudentInfoEntity) As List(Of Entity.StudentInfoEntity) Implements IStudentInfo.SelectStudentInfoDim List As New List(Of Entity.StudentInfoEntity)Dim table As DataTableDim sql As StringDim sqlPramas As SqlParameter() = {New SqlParameter("@IDcard", Stu.IDcard)}sql = "select * from [StudentInfo] where IDcard=@IDcard"table = SQLHelper.ExecSelect(sql, CommandType.Text, sqlPramas)If table.Rows.Count > 0 ThenList = ConvertListDAL.convertToList(Of Entity.StudentInfoEntity)(table)Return ListElseReturn NothingEnd IfEnd FunctionPublic Function ChangePWD(Stu As Entity.StudentInfoEntity) As Integer Implements IStudentInfo.ChangePWDDim result As IntegerDim sql As StringDim sqlParams As SqlParameter() = {New SqlParameter("@IDcard", Stu.IDcard), New SqlParameter("@StuPWD", Stu.StuPWD)}sql = "update [StudentInfo] set StuPWD=@StuPWD where IDcard=@IDcard"result = SQLHelper.ExecAddDelUpdate(sql, CommandType.Text, sqlParams)Return resultEnd FunctionPublic Function Online(ByVal Stu As Entity.StudentInfoEntity) As Integer Implements IStudentInfo.OnlineDim result As IntegerDim sql As StringDim sqlParams As SqlParameter() = {New SqlParameter("@IDcard", Stu.IDcard)}sql = "update [StudentInfo] set IsCheck='未结账' where IDcard=@IDcard"result = SQLHelper.ExecAddDelUpdate(sql, CommandType.Text, sqlParams)Return resultEnd FunctionPublic Function UpdateCash(Stu As Entity.StudentInfoEntity) As Integer Implements IStudentInfo.UpdateCashDim result As IntegerDim sql As StringDim sqlParams As SqlParameter() = {New SqlParameter("@IDcard", Stu.IDcard), New SqlParameter("@Cash", Stu.Cash)}sql = "update [StudentInfo] set Cash=@Cash where IDcard=@IDcard"result = SQLHelper.ExecAddDelUpdate(sql, CommandType.Text, sqlParams)Return resultEnd Function
End Class

再加上七层之间的引用关系,大家应该明白了七层之间的逻辑了吧!


整个机房,耗时大约有一个月,从文档到验收,延期两次,整得自己战战兢兢,不过,学到的东西也不可同日而语,存储过程,视图的创建使用,模版,泛型,更加重要的是,显著培养了自己的调碼能力,最值得炫耀的事,就在这,我竟然看到好几次英文的材料,不是还没到这个阶段吗?更甚至,我竟然还看懂了一部分,获益良多啊

整体对机房先介绍这么多,下个月,我们接续



















这篇关于经典三层 变 七层的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1109367

相关文章

HotSpot虚拟机的经典垃圾收集器

读《深入理解Java虚拟机》第三版笔记。 关系 Serial、ParNew、Parallel Scavenge、Parallel Old、Serial Old(MSC)、Concurrent Mark Sweep (CMS)、Garbage First(G1)收集器。 如图: 1、Serial 和 Serial Old 收集器 2、ParNew 收集器 3、Parallel Sc

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

嵌入式面试经典30问:二

1. 嵌入式系统中,如何选择合适的微控制器或微处理器? 在嵌入式系统中选择合适的微控制器(MCU)或微处理器(MPU)时,需要考虑多个因素以确保所选组件能够满足项目的具体需求。以下是一些关键步骤和考虑因素: 1.1 确定项目需求 性能要求:根据项目的复杂度、处理速度和数据吞吐量等要求,确定所需的处理器性能。功耗:评估系统的功耗需求,选择低功耗的MCU或MPU以延长电池寿命或减少能源消耗。成本

Leetcode面试经典150题-128.最长连续序列-递归版本另解

之前写过一篇这个题的,但是可能代码比较复杂,这回来个简洁版的,这个是递归版本 可以看看之前的版本,两个版本面试用哪个都保过 解法都在代码里,不懂就留言或者私信 class Solution {/**对于之前的解法,我现在提供一共更优的解,但是这种可能会比较难懂一些(思想方面)代码其实是很简洁的,总体思想如下:不需要排序直接把所有数放入map,map的key是当前数字,value是当前数开始的

力扣 739. 每日温度【经典单调栈题目】

1. 题目 理解题意: 1.1. 给一个温度集合, 要返回一个对应长度的结果集合, 这个结果集合里面的元素 i 是 当前 i 位置的元素的下一个更高温度的元素的位置和当前 i 位置的距离之差, 若是当前元素不存在下一个更高温度的元素, 则这个位置用0代替; 2. 思路 本题用单调栈来求解;单调栈就适用于来求当前元素左边或者右边第一个比当前元素大或者小的元素;【单调栈:让栈中的元素保持单调

接口自动化三大经典难题

目录 一、接口项目不生成token怎么解决关联问题 1. Session机制 2. 基于IP或设备ID的绑定 3. 使用OAuth或第三方认证 4. 利用隐式传递的参数 5. 基于时间戳的签名验证 二、接口测试中网络问题导致无法通过怎么办 1. 重试机制 2. 设置超时时间 3. 使用模拟数据 4. 网络问题的预检测 5. 日志记录与错误分析 6. 切换网络环境 7.

嵌入式面试经典30问:一

什么是嵌入式系统? 嵌入式系统是指嵌入到某个对象体系中的专用计算机系统,它负责执行特定的任务,具有专用性、隐蔽性、资源受限和可靠性要求高等特点。通常包括硬件和软件两部分,硬件以微处理器为核心,软件则负责控制和管理硬件资源,实现特定的应用功能。 嵌入式系统和普通计算机系统有什么区别? 嵌入式系统与普通计算机系统的主要区别在于目的、资源、性能和成本等方面。嵌入式系统通常针对特定应用设计,具有体积小

Leetcode面试经典150题-2.两数相加

解法都在代码里,不懂就留言或者私信 理论上提交这个就是最优解 字节考过不下20次,这个高居字节面试榜第9名 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) {

整理的经典面试题及各种库函数的自己实现

进程间通信方式 管道(有名管道,无名管道),共享内存,消息队列,信号量,socket通信 线程同步方式 临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问 互斥量:为协调共同对一个共享资源的单独访问而设计 信号量(PV操作):为控制一个具有有限数量用户资源而设计 事件:用来通知线程有一些事件已 进程和线程的区别 资源:进程是拥有资源的一个独立单位,线程是

性能测试经典案例解析——政务查询系统

各位好,我是  @道普云 一站式云测试SaaS平台。一个在软件测试道路上不断折腾十余年的萌新。 欢迎关注我的主页 @道普云 文章内容具有一定门槛,建议先赞再收藏慢慢学习,有不懂的问题欢迎私聊我。 希望这篇文章对想提高软件测试水平的你有所帮助。 政务查询系统的用户量相对来说是比较小的,但是它的复杂性和对实时性的要求是比较高的,我们以一个主要提供单位信息业务复杂查询功能的