剪不断,理不乱——三层架构之抽象工厂加反射
2013-02-06 08:01
183 查看
三层架构前面已经介绍过了,浅谈三层架构。本篇文章主要介绍三层架构中加入抽象工厂和反射加配置文件。以机房收费系统的登录为例。
首先对机房收费系统进行分层,分为三层表示层,业务逻辑层,数据访问层。为了降低系统的耦合性,符合系统的开放封闭原则又加入了外观模式和抽象工厂模式。下面是我画的包图。
在画包图的过程中也是在对系统的认识一步步加深的,也是在不断的修改过程中逐步完善起来的。 图中很明白的体现出了各层之间的引用关系。
在U层和B层之间加入了外观模式,使U层和B层分离,为系统提供一个简单的接口,使得耦合性大大降低,减少了它们之间的依赖.
在B层和D层之间加入了抽象工厂模式,使得B层和D层分离,通过抽象工厂加反射返回一个接口,D层去实现接口,体现了D层的可移植性.
下面画的是机房收费系统登录的时序图:
U层负责数据的输入,代码如下
外观层负责登录时验证用户名和密码是否合法
B层负责逻辑处理,用户名和密码的验证逻辑
抽象工厂负责数据库的选择和创建接口
在这里利用抽象工厂的二维性,一个是数据库的选择,另一个是表的选择,利用抽象工厂可以以很方便的对数据库进行选择,只需要更改配置文件中的内容就好了,不需要更改其它地方,很好的体现了开放封闭原则.
IDAL层负责放置接口
D层负责实例化接口,和数据库打交道
总结:通过理论的学习,在实践中才能成长的更快。三层架构很好的体现了分层的思想,通过把系统分成个层次,结构更加清晰明了,通过设计模式的加入让我的系统开发维护起来更加方便,完善。比如加上策略模式实现对算法的封装,解决对固定用户与临时用户的计费方式。相反有时候还会感觉到加上三层和设计模式后代码量的增多。
本篇文章是我对分层思想以及设计模式的浅显的认识,望各位大虾指点。
首先对机房收费系统进行分层,分为三层表示层,业务逻辑层,数据访问层。为了降低系统的耦合性,符合系统的开放封闭原则又加入了外观模式和抽象工厂模式。下面是我画的包图。
在画包图的过程中也是在对系统的认识一步步加深的,也是在不断的修改过程中逐步完善起来的。 图中很明白的体现出了各层之间的引用关系。
在U层和B层之间加入了外观模式,使U层和B层分离,为系统提供一个简单的接口,使得耦合性大大降低,减少了它们之间的依赖.
在B层和D层之间加入了抽象工厂模式,使得B层和D层分离,通过抽象工厂加反射返回一个接口,D层去实现接口,体现了D层的可移植性.
下面画的是机房收费系统登录的时序图:
U层负责数据的输入,代码如下
Public Class frmLogin '登录代码 Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click '把用户名和密码放到一个实体中 Dim user As New Entity.UserInfo user.userName = txtUserName.Text user.passWord = txtPassWord.Text Dim loginUI As New Facade.LoginFAC Dim strResult As String strResult = loginUI.login(user) '用户名和密码验证的几种情况 Select Case strResult Case "此用户不存在" MsgBox("此用户不存在,请重新输入用户名!") txtUserName.Focus() txtUserName.SelectAll() Case "密码不正确" MsgBox("密码不正确,请重新输入密码!") txtPassWord.Focus() txtPassWord.SelectAll() Case "此用户已经在线" MsgBox("该用户已在线", "警告") Case "登录成功" frmMain.Show() 'Me.Close() End Select End Sub '退出 Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click End End Sub End Class
外观层负责登录时验证用户名和密码是否合法
Imports BLL Public Class LoginFAC Public Function login(ByVal user As Entity.UserInfo) As String Dim ConfirmUserBll As New BLL.ConfirmUser '调用B层的方法验证用户名和密码是否存在 If Not ConfirmUserBll.IsExists(user) Then Return "此用户不存在" Else If Not ConfirmUserBll.ConfirmPwd(user) Then Return "密码不正确" Else Return "登录成功" End If End If End Function End Class
B层负责逻辑处理,用户名和密码的验证逻辑
Imports Factory Imports IDAL '验证用户 Public Class ConfirmUser '用户名存在不存在 Public Function IsExists(ByVal user As Entity.UserInfo) As Boolean Dim Iuser As IDAL.IUserInfo Dim factory As New Factory.DBFactory 'factory = DBFactory.GetIstance '调用工厂的方法创建出一个接口 Iuser = factory.CreateUserDAO() If Iuser.QueryUserInfo(user).userName = "" Then Return False Else Return True End If End Function '验证密码正确不正确 Public Function ConfirmPwd(ByVal user As Entity.UserInfo) As Boolean Dim Iuser As IDAL.IUserInfo Dim factory As New Factory.DBFactory 'factory = DBFactory.GetIstance Iuser = factory.CreateUserDAO If Iuser.QueryUserInfo(user).passWord = "" Then Return False Else Return True End If End Function End Class
抽象工厂负责数据库的选择和创建接口
Imports System.Reflection Imports System.Configuration Imports IDAL Public Class DBFactory Dim strDB As String = System.Configuration.ConfigurationSettings.AppSettings("DB") 'Dim strSpace As String = strDB & "DAL" 'Dim strClassName As String Public Function CreateUserDAO() As IDAL.IUserInfo Return CType(Assembly.Load("DAL").CreateInstance("DAL" & "." & strDB), IUserInfo) End Function End Class
在这里利用抽象工厂的二维性,一个是数据库的选择,另一个是表的选择,利用抽象工厂可以以很方便的对数据库进行选择,只需要更改配置文件中的内容就好了,不需要更改其它地方,很好的体现了开放封闭原则.
IDAL层负责放置接口
Public Interface IUserInfo '查询用户的接口函数 Function QueryUserInfo(ByVal user As Entity.UserInfo) As Entity.UserInfo End Interface
D层负责实例化接口,和数据库打交道
Imports Entity Imports IDAL Imports System.Data.SqlClient Public Class Sqlserver : Implements IUserInfo '调用配置文件与数据库的连接 Dim strConnStr As String = System.Configuration.ConfigurationSettings.AppSettings("Connstr") Dim conn As SqlConnection = New SqlConnection(strConnStr) '查询用户和密码是否存在 Public Function QueryUserInfo(ByVal user As Entity.UserInfo) As Entity.UserInfo Implements IUserInfo.QueryUserInfo Dim Sqlserver As String = "select * from T_User where userName='" & user.userName & "'" Dim cmd As SqlCommand = New SqlCommand(Sqlserver, conn) Dim read As SqlDataReader Try conn.Open() read = cmd.ExecuteReader read.Read() user.userName = read.Item("userName") user.passWord = read.Item("passWord") Return user Catch ex As Exception user.passWord = "" Return user End Try End Function End Class
总结:通过理论的学习,在实践中才能成长的更快。三层架构很好的体现了分层的思想,通过把系统分成个层次,结构更加清晰明了,通过设计模式的加入让我的系统开发维护起来更加方便,完善。比如加上策略模式实现对算法的封装,解决对固定用户与临时用户的计费方式。相反有时候还会感觉到加上三层和设计模式后代码量的增多。
本篇文章是我对分层思想以及设计模式的浅显的认识,望各位大虾指点。
相关文章推荐
- .NET完全手动搭建三层B/S架构
- 委托事件三层架构 cloudfogger
- 三层架构图[转]
- MFC原创:三层架构03(人事管理系统)源程序发布 .
- 从C/S模式下的三层架构说起
- 对三层架构的简单改进
- 【转】浅析MVC模式与三层架构的区别
- C# ComboBox的联动操作(三层架构)
- [.NET 三层架构(ADO.NET)+Web Service+多语言]WinForm三层架构重新实现TaskVision,外加WebService提供数据和多语言
- .net 三层架构的认识
- 也谈TDD,以及三层架构、设计模式、ORM……:没有免费的午餐
- 三层架构问题----解耦
- 转:从三层架构到MVC-MVP
- 三层架构之泛型应用
- MVC与三层架构的区别
- ssm框架与三层架构
- NET高级开发一:用VB.net+ADO.NET+SQL Server开发三层架构的运用程序
- (引用qghboy)MVC 与三层架构的区别
- 三层架构之泛型应用
- 三层架构(我了解并详细分析)