机房收费系统=三层+设计模式

原创 2015年11月18日 20:11:26

在简单的三层登陆完成之后,我又在其中加入了设计模式,其中包括抽象工厂+反射和外观模式.关于设计模式,在学习三层之前我们已经系统的学习过,可是在这次往机房收费系统中加设计模式时,还是感觉无从下手,出现了学没有致用的尴尬情景.不过这也体现了我们提高班学习中项目驱动的优势.

   接下来是我的一些现有思路,可能还不很准确,期待读者朋友的指点.

   先说一下简单的三层登陆思想吧:

   我们现阶段接触的三层就是最基本的三层--UI,BLL层和DAL.关于这三者之间的关系,在我前面博客中有所涉及,如果有兴趣,你可以参看:三层架构入门

   言归正传,理论知识我们知道了,在机房收费系统中,我们究竟是如何利用这三层来简化灵活我们的代码的呢?(由于.NET版本的登陆已经加入设计模式,所以简单三层C#语言来展示.)

   大家可以先看下主体代码:

   UI: 代码如下:

  1. <span style="font-size:18px;">private void btnOK_Click(object sender, EventArgs e)  
  2.         {  
  3.             UserInfo user = new UserInfo();  
  4.             //向实体层传递参数  
  5.             string UserName = txtUserName.Text.Trim();  
  6.             string Password = txtPassword.Text.Trim();  
  7.             user.UserName=UserName ;  
  8.             user.Password = Password;  
  9.             //实例化BLL层,并调用BLL层方法  
  10.             LoginManager mgr = new LoginManager();  
  11.             UserInfo user2 = new UserInfo();  
  12.             user2 = mgr.UserLogin(user);  
  13.             MessageBox.Show("登录用户:" + user.UserName);  
  14.         }  
  15. </span>  

   U,就是我们窗体类,是用户唯一可以看到的部分.其中不涉及连接数据库,也不会包括业务逻辑.它主要负责接收用户输入指令并传给实体类,再有实体类传给B,进行业务逻辑的判断.同时它也会根据B层产生的不同结果来及时反馈给用户.


   BLL: 代码如下:

  1. <span style="font-size:18px;">public  class LoginManager  
  2.     {  
  3.         public UserInfo UserLogin(UserInfo user)  
  4.         {  
  5.             //实例化DAL层,并调用DAL层方法  
  6.             UserDAO uDAO = new UserDAO();  
  7.             user = uDAO.SelectUser(user  );  
  8.             //逻辑判断代码  
  9.             if (user != null)  
  10.             {  
  11.                 ScoreDAO sDAO = new ScoreDAO();  
  12.                 sDAO.UpdateScore(user, 10);  
  13.                 return user;  
  14.             }  
  15.             else  
  16.             {  
  17.                 throw new Exception("登录失败!");  
  18.             }  
  19.         }  
  20. </span>  

   这一层是业务逻辑层,顾名思义,它主要负责系统中的绝大部分逻辑判断,一旦U层或者D层出现业务逻辑判断,我们就要考虑,它是不是应该放在B.


   DAl: 代码如下:

  1. <span style="font-size:18px;">namespace Login.DAL  
  2. {  
  3.      public  class UserDAO  
  4.     {  
  5.          /// <summary>  
  6.          /// 连接数据库,获取用户信息  
  7.          /// </summary>  
  8.          /// <param name="user">用户信息实体</param>  
  9.          /// <returns>用户信息</returns>  
  10.         public UserInfo  SelectUser(UserInfo user)  
  11.         {          
  12.             using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))   //有待填写  
  13.             {  
  14.                 SqlCommand cmd = conn.CreateCommand();  
  15.                 cmd.CommandText = @"SELECT ID, UserName,Password,Email from Users where UserName=@UserName and Password=@Password";  
  16.                 cmd.CommandType = CommandType.Text;  
  17.                   
  18.                 cmd.Parameters.Add(new SqlParameter ("@UserName",user.UserName  ));  
  19.                 cmd.Parameters.Add(new SqlParameter ("@Password",user.Password ));  
  20.                 conn.Open();  
  21.   
  22.                 SqlDataReader reader = cmd.ExecuteReader();  
  23.                 user=null;  
  24.                 while (reader .Read ())//Read()方法:读取一个表的记录  
  25.                 {  
  26.                     if (user == null)  
  27.                     {  
  28.                         user = new UserInfo();  
  29.                     }  
  30.                     user.ID = reader.GetInt32(0);  
  31.                     user.UserName = reader.GetString(1);  
  32.                     user.Password = reader.GetString(2);  
  33.                     if (!reader.IsDBNull(3))   
  34.                     {  
  35.                         user.Email = reader.GetString(3);  
  36.                     }  
  37.                 }  
  38.                 return user;      
  39.             }  
  40.         }  
  41.     }  
  42. }  
  43. </span>  

   从以上的代码就可以看出,D层主要是连接数据库,从数据库中读取信息,然后再以实体的形式传给B,B层传给U,最后表现在用户面前.

 

   上述是没有添加设计模式的简单三层登陆,下面就要谈一谈为什么要加设计模式,以及如何添加设计模式了.

   设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结.使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。也许这样说读者还是不大明白,下面的代码展示或许可以给您一些启示.

   首先说一下抽象工厂+反射,在机房登录中的应用(只展示主体代码,方便理解).

   Abstract Factory: 抽象工厂接口,它里面包含所有产品创建的抽象方法.工厂类被BLL层调用,并调用IDAL接口,使用配置文件读取数据库字符串.通过反射技术,解除简单工厂更换数据库时的分支判断带来的耦合.

   代码如下:

  1. <span style="font-size:18px;">Imports System.Configuration  
  2. Imports System.Reflection  
  3. Imports IDAL  
  4.   
  5. Public Class SqlFactory  
  6.     Private Shared ReadOnly AssemblyName As String = "DAL"  
  7.     '使用配置文件,读取数据库连接字符  
  8.     Private Shared DB As String = ConfigurationManager.AppSettings("strDB")  
  9.  
  10. #Region "获取用户信息"  
  11.     Public Shared Function CreatGetUserInfo() As IDAL.IGetUserInfo  
  12.         Dim UserInfo As IGetUserInfo  
  13.         Dim ClassName As String  
  14.         '反射技术,解除简单工厂更换数据库时的分支判断带来的耦合  
  15.         ClassName = AssemblyName + "." + DB + "D_GetUserInfo"  
  16.         UserInfo = CType(Assembly.Load(AssemblyName).CreateInstance(ClassName), IDAL.IGetUserInfo)  
  17.         Return UserInfo  
  18.     End Function  
  19. #End Region  
  20. </span>  

   IDAL接口:  B层和D层调用,使得B层和D层的耦合度极大降低.

  1. <span style="font-size:18px;">Imports Entity  
  2.   
  3. Public Interface IGetUserInfo  
  4.     Function GetUserInfo(ByVal e_Users As Entity.E_UserInfoEntity) As DataTable  
  5. End Interface  
  6. </span>  

   BLL:  定义接口类,并使用工厂类SqlFactory方法反射实例化相应的DAl.这时候B层和D层已经完全不再耦合,B层或者D层的任何变动,都不会影响另一层.(这就是我们使用抽象工厂加反射的最大用处了.)

  1. <span style="font-size:18px;">Imports Entity  
  2. Imports IDAL  
  3. Imports DBFactory.SqlFactory  
  4. Imports DAL  
  5.   
  6. Public Class B_UserInfo  
  7.     '创建工厂类,作用:创建接口对象  
  8.     Public SqlFactory As New DBFactory.SqlFactory  
  9. #Region "验证用户密码"  
  10.     Public Function VerifyPassword(ByVal EUserInfo As E_UserInfoEntity) As Boolean  
  11.   
  12.         '创建获得用户信息的接口  
  13.         Dim IGetPWD As IDAL.IGetUserInfo  
  14.         IGetPWD = DBFactory.SqlFactory.CreatGetUserInfo  
  15.         Dim dtUserInfo As DataTable  
  16.         dtUserInfo = IGetPWD.GetUserInfo(EUserInfo)  
  17.   
  18.         If dtUserInfo.Rows.Count = 0 Then  
  19.             Throw New Exception("该用户还未注册!")  
  20.             Return False  
  21.         End If  
  22.   
  23.         '判断密码是否正确  
  24.         If EUserInfo.Passwrod = Trim(dtUserInfo.Rows(0).Item(1)) Then  
  25.             Return True  
  26.         Else  
  27.             Return False  
  28.         End If  
  29.     End Function  
  30. #End Region  
  31. End Class  
  32. </span>  

   抽象工厂和反射解耦和B层和D层.接下来的外观模式就要解耦U层和B层了.

   Facade类: 在简单的三层中,界面层的登陆需要根据B层返回的值再进行判断,这样B层和U层的耦合度是比较高的.而加入外观模式后,上面提到的对B层返回值进行判断就可以移到外观类中.这样就充分实现了B层和U层的分离.

  1. <span style="font-size:18px;">Imports Entity  
  2. Imports BLL  
  3.   
  4. Public Class Login  
  5.     Private bUserInfo As New B_UserInfo  
  6.     Dim blnFlag As Boolean = False  
  7.     ''' <summary>  
  8.     ''' 对B层的返回值进行逻辑判断  
  9.     ''' </summary>  
  10.     ''' <param name="eUserInfo">用户信息实体</param>  
  11.     ''' <returns>用户信息正确返回True,错误返回False</returns>  
  12.     ''' <remarks></remarks>  
  13.     Public Function IsPassword(ByVal eUserInfo As E_UserInfoEntity) As Boolean  
  14.         Try  
  15.             blnFlag = bUserInfo.VerifyPassword(eUserInfo)  
  16.         Catch ex As Exception  
  17.             MsgBox(ex.Message, vbOKOnly, "提示信息")  
  18.         End Try  
  19.   
  20.         If blnFlag = True Then  
  21.             Return True  
  22.         Else  
  23.             MsgBox("密码错误,请重新输入!")  
  24.             Return False  
  25.         End If  
  26.     End Function  
  27. End Class  
  28. </span>  

   UI:   外观层在对B层返回值进行判断之后,返回信息给UI层.这样U层和B层就实现了分离,两者中任何一层发生变化都不用修改另一层的代码.

  1. <span style="font-size:18px;">Imports Entity  
  2. Imports BLL  
  3. Imports Facade.Login  
  4.   
  5.   
  6. Public Class frmLogin  
  7.     Public bUserInfo As New B_UserInfo  
  8.     Public faUserInfo As New Facade.Login  
  9.   
  10.     Private Sub btnOK_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles btnOK.Click  
  11.         Dim aUserInfo As New Entity.E_UserInfoEntity  
  12.         Dim blnFlag As Boolean = False  
  13.   
  14.         aUserInfo.UserID = Trim(txtUserName.Text)  
  15.         aUserInfo.Passwrod = Trim(txtPassword.Text)  
  16.   
  17.         '调用外观类的IsPassword方法进行逻辑判断  
  18.         Try  
  19.             blnFlag = faUserInfo.IsPassword(aUserInfo)  
  20.         Catch ex As Exception  
  21.             MsgBox(ex.Message, vbOKOnly, "提示信息")  
  22.         End Try  
  23.   
  24.         If blnFlag = True Then  
  25.             frmMain.Show()  
  26.         End If  
  27.     End Sub  
  28. End Class  
  29. </span>  

   上述是我现阶段对三层和部分设计模式的理解,错误之处希望读者朋友多多指教!

版权声明:本文为博主原创文章,未经博主允许不得转载。

【机房收费系统】——从三层到七层

开始机房也已经一段时间了,但是一直没有写东西,今天就来谈谈三层结构是如何到七层的吧!在谈论七层之前首先来回忆一下三层,三层架构是为了解决原来用户直接依赖数据库的问题,增加了业务逻辑层,降低层与层之间的...
  • u013045214
  • u013045214
  • 2015年05月10日 14:41
  • 881

重构机房收费系统—浅谈三层

重构机房基本完成了,期间三层重构完了,推翻之后,再重构七层(外观和工厂),再重构,来来回回用了一个月........   重构机房从画图画到一半就废弃了,因为对三层不熟,之后,做完了,才敢重新拾...
  • judyge
  • judyge
  • 2015年11月11日 08:45
  • 204

初识MVC——MVC与三层/MVC与设计模式

题记:对于刚接触项目的菜鸟来说,MVC是一个新鲜的东西,浅显的知道MVC是分为MODEL、View和controler层,于是觉得它与我们曾经用到的三层架构相似,于是就错误的混到了一起。由于想要知道它...
  • u012581322
  • u012581322
  • 2015年12月16日 21:53
  • 867

设计模式VS三层架构

在之前我们接触过设计模式.那么三层架构和设计模式之间到底有什么样的联系呢?   一.回顾设计模式          设计模式遵循的设计原理为"高内聚,低耦合".设计模式的核心思想是代码的可重用...
  • tang_huan_11
  • tang_huan_11
  • 2013年01月22日 21:29
  • 2825

.net机房收费系统实例—三层+设计模式

最近在做.net机房收费系统,和简单的三层来一个对比,现在贴出来和大家分享! 包图:         应用了设计模式(抽象工厂),这样使得B层和D层之间无需再有关系(应用接口)当B或...
  • hejingyuan6
  • hejingyuan6
  • 2013年02月18日 10:28
  • 2233

机房收费系统——三层

这是一个终将过去的坎,看看代码,找找感觉,过去也不是那么的难。
  • u013046591
  • u013046591
  • 2015年04月07日 09:09
  • 393

java之 ------ DAO设计模式的【详解】及常见设计模式的【应用】

DAO Data Access Object(数据访问接口) 一、场景和问题 在Java程序中,经常需要把数据持久化,也需要获取持久化的数据,但是在进行数据持久化的过程中面临诸多问题(如:数据源 ...
  • u011479875
  • u011479875
  • 2015年08月25日 00:07
  • 1602

三层架构模式(开发实践很重要)

题记: 多层开发模式 是开发软件 都要用到的一个思想 , 不管是Java还是C#都是要用到的. 经验: DLL : 动态链接库(就是类库)exe 和 dll 的区别?   就是一个有主函数...
  • zhongxia245
  • zhongxia245
  • 2014年03月01日 21:12
  • 1473

三层小总结

前言   学习了三层,首先再来复习一下什么是三层,为什么要使用三层,三层关系。   三层定义   三层在实际含义中理解就是将整个业务应用分成三层,即:表现层,业务逻辑层,数据访问层。   ...
  • Alisawxn
  • Alisawxn
  • 2015年12月27日 10:28
  • 586

三层架构设计模式

               三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的...
  • piaojun_pj
  • piaojun_pj
  • 2010年09月16日 13:05
  • 9656
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:机房收费系统=三层+设计模式
举报原因:
原因补充:

(最多只允许输入30个字)