三层架构前面已经介绍过了,浅谈三层架构。本篇文章主要介绍三层架构中加入抽象工厂和反射加配置文件。以机房收费系统的登录为例。

首先对机房收费系统进行分层,分为三层表示层,业务逻辑层,数据访问层。为了降低系统的耦合性,符合系统的开放封闭原则又加入了外观模式和抽象工厂模式。下面是我画的包图。

在画包图的过程中也是在对系统的认识一步步加深的,也是在不断的修改过程中逐步完善起来的。 图中很明白的体现出了各层之间的引用关系。

在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

总结:通过理论的学习,在实践中才能成长的更快。三层架构很好的体现了分层的思想,通过把系统分成个层次,结构更加清晰明了,通过设计模式的加入让我的系统开发维护起来更加方便,完善。比如加上策略模式实现对算法的封装,解决对固定用户与临时用户的计费方式。相反有时候还会感觉到加上三层和设计模式后代码量的增多。

本篇文章是我对分层思想以及设计模式的浅显的认识,望各位大虾指点。

剪不断,理不乱——三层架构之抽象工厂加反射相关推荐

  1. 《三层架构之抽象工厂加反射》纠错

    每当别人问我关于三层的知识的时候我总是推荐自己的<三层架构之抽象工厂加反射>这篇博客.这篇博客是自己当时学习三层的时候写的一个简单的登录例子.这个例子通过登录这个用例简单的介绍了三层,然后 ...

  2. 三层架构之抽象工厂加反射mdash;mdash;实现数据库转换

    在做系统的时候有意识的用到了抽象工厂这个设计模式,主要解决的是数据库更换的问题. 下面就以简单的登录来逐步的分析一下这个模式. 经典的三层架构 数据库如下 1.      一般的数据库连接方式 界面层 ...

  3. 三层之抽象工厂加反射实例

    C#版的三层登陆实例,只是为了学习三层而实现的.为了接下来需要进行的vb.net版机房收费系统.根据上次的C#改编的vb.net版本登陆实例.不过在验收的时候发现了很多问题,所以进行了修改. 花费好几 ...

  4. 机房重构 之 抽象工厂+反射+配置文件 实现数据库訪问

    重构机房已经開始三个多星期了,从刚開始的一头雾水,到如今的柳暗花明,由開始的无从下手,到如今感觉犹 如脱胎换骨了般.和两个星期前相比.如今明朗了多了,心情也好了不少. 先给大家看一下这次重构的总体架构 ...

  5. 简单工厂模式,抽象工厂模式,反射工厂模式的代码总结

    工厂模式也用了不少,特别是MS的petshop中对数据库的访问,通过工厂模式可以达到自由切换SQL 和 Oracle 数据库.近来也在看设计模式的书,发现工厂模式还是有不少的扩展.结合书中的知识和我自 ...

  6. 简单工厂、工厂方法、抽象工厂、抽象工厂加简单工厂

    简单工厂模式:简单工模式时类的创建模式,又叫做静态工厂方法(static Factory Method).简单工厂模式是一个工厂对象决定创建出哪一种产品类的实例.它存在的目的很简单:定义一个创建对象的 ...

  7. C# 三层级架构问题之 能加载文件或程序集或它的某一个依赖项。系统找不到指定的文件

    用抽象工厂加反射来确定调用哪一个D层的时候,出现了错误"未能加载文件或程序集或它的某一个依赖项.系统找不到指定的文件" 如下图所示: 出现这种错误有两种情况: 1.      DL ...

  8. 浅谈Java三层架构

    1. 设计思想: 高内聚,低耦合. 2. 优点 结构明确,开发人员只需关注其中某一层即可: 降低层与层之间的依赖,即低耦合性: 可以方便快捷地用新的实现替换原有的层次实现: 后期维护时,降低维护成本和 ...

  9. asp.net三层架构详解

    一.数据库 /*==============================================================*/ /* DBMS name:      Microsof ...

最新文章

  1. 【笔记】mysql入门语句8条
  2. 财务一体化项目,进度与计划17
  3. 邮件群发工具的编写(二)数据的保存
  4. “我今年 31 岁,工作 7 年,明年退休...”
  5. windows服务编写原理(下)
  6. 传统金融为什么要做AI?平安保险CEO解读行业痛点
  7. ajax的post方式传数组参数
  8. PyTorch——PyTorch也支持通过累加操作实现大的BatchSize的训练
  9. create报错不是函数_node.js – sequelize .create不是函数错误
  10. 项目管理工具——TargetProcess(2)
  11. pdf资源有密码怎么办?
  12. java 流水_Java之流水号生成器实现
  13. pytorch绘制loss和accuracy曲线
  14. 量子计算机 并行,核磁共振量子计算机与并行量子计算
  15. IT人二十年后再定位
  16. Git Bash复制粘贴快捷键失效问题
  17. java将uuid转换成大写_java实现无符号数转换、字符串补齐、md5、uuid、随机数示例...
  18. 2014诺贝尔化学奖(了解学习)
  19. 全面解析ThreadLocal
  20. Python Scrapy 上传图片到FastDfs(py3fdfs)

热门文章

  1. 在Linux上安装VLC播放器
  2. linux用户禁止登录,Linux限制用户登录
  3. Error: tunneling socket could not be established, cause=getaddrinfo ENOTFOUND 11000
  4. 面试中,五大经典“送命题”该如何正确回答?
  5. 设置删除命令别名--用Enki学Linux系列(10)
  6. 最短路问题 Dijkstra标号法
  7. spark大数据分析:spark Struct Strreaming(21) 数据流处理
  8. ASP.NET profile之 找不到存储过程dbo.aspnet_CheckSchemaVersion
  9. window电脑垃圾清理脚本
  10. vue3 将文字或链接生成二维码 qrcode.vue