机房收费系统总结之5——抽象工厂+反射+配置文件
起初,机房收费系统用纯三层在做,三层结构已把高内聚,低耦合的思想发挥的淋漓尽致。因为一直听说“抽象工厂”,也开始尝试去应用,经过了一番尝试,也OK了。其中当然会用到反射和配置文件,而接口的引入也是顺理成章的。接口对B层和D层又完成了进一步解耦。

有了图也就类似于有了思想,有了宏观的把控。可以看到,这个包图,是从最经典的三层UI-BLL-DAL加入设计模式演化而来。之所以采用抽象工厂模式是考虑到更换数据库的方便。(而应用外观模式,是为了解决UI层和BLL层耦合性过高的问题,UI层不必知道BLL层的存在,Facade(外观)知道BLL层的哪些类负责处理哪些请求,它将UI的请求代理给适当的BLL层的类。使外部调用更方便。)
下面就以登录(Login)这个小Demo中的部分功能为例来阐述过程的实现。
前面的一篇博客(机房收费系统总结之3——SqlHelper)介绍过,这里不再赘述。
实体层并不属于三层中的任何一层,它是独立出来的一层,可以把他看做自定义变量的组合,供三层使用。数据库设计好了,我们要根据数据库中的表抽象实体类,在机房收费系统中,实体类基本上是跟表一一对应的,一个表映射出一个实体类,表的字段即为实体类的属性。但,对于全局用的东西,我们可以建一个实体类,把该全局变量作为它的属性。所以,实体类的数量可能多余表的数量。
Imports FacadeImports EntityPublic Class frmLogin Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click Dim strComName As String = System.Net.Dns.GetHostName() '获取计算机名并赋值给变量strComName '给公共变量中的计算机名和用户名赋值 PublicEntity.ComName = strComName PublicEntity.UserName = txtUserName.Text.Trim() '定义一个UserInfoEntity类型的实体类变量,并分别把输入的用户名和密码赋值给变量的UserName属性和Password属性 Dim enUserInfo As New UserInfoEntity With {.UserName = txtUserName.Text.Trim(), .Password = txtPassword.Text.Trim()} '定义一个UserWorkEntity类型的实体类变量,并分别打输入的用户名和所获得的计算机名赋值给变量的UserName属性和ComName属性 Dim enUserWord As New UserWorkEntity With {.UserName = txtUserName.Text.Trim(), .ComName = strComName} '判断是否输入了用户名及密码 If txtUserName.Text.Trim() = "" Then MessageBox.Show("请输入用户名", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) Exit Sub ElseIf txtPassword.Text.Trim() = "" Then MessageBox.Show("请输入用密码", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) Exit Sub End If Try Dim facadeLogin As LoginFacade = New LoginFacade() '声明LoginFacade类型变量facadeLogin,并实例化 facadeLogin.Login(enUserInfo, enUserWord) '调用Login()方法,完成登录 Me.Hide() '隐藏登录窗体 frmMain.Show() '显示主窗体 Catch ex As Exception '捕获异常并显示 MsgBox(ex.Message, CType(vbOKOnly + MsgBoxStyle.Information, MsgBoxStyle), "提示") End Try End SubEnd Class
- 1楼lfmilaoshi昨天 21:50
- 系统登录Demo写得很详细,也很深入浅出。你尝试着做个视频吧!