抽象工厂+反射 登陆实例
来源:互联网 发布:中国软件行业现状 编辑:程序博客网 时间:2024/05/03 08:25
在不懈的努力下,终于把加上设计模式的登陆实例给拿下啦,下面就给大家讲讲抽象工厂加反射的登陆实例是怎么实现的!
首先先看下关于三层中的登陆小例子,把三层之间层与层之间的关系理清楚。点击打开链接
抽象工厂+反射的作用就是降低B层与D层之间的耦合度,利用反射可以解决在程序中想变更其他数据库但是不用重新更改代码的问题,同样也是降低了与数据库之间的耦合度。
接下来以具体的登陆实例介绍下抽象工厂+反射的设计模式在代码中到底是怎么运用的。
一、U层代码
用户登陆时最先接触到的是U层,U层负责接收用户所输入的信息传入B层!(在U层和B层之间也可以加上外观模式,在这里先不做介绍)
Imports ModelImports system_BLLPublic Class frmLogin ''' <summary> ''' 用户登录界面,判断用户能否成功登陆 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> ''' <remarks></remarks> Public Sub cmdLogin_Click(sender As Object, e As EventArgs) Handles cmdLogin.Click '实例化实体类 Dim LUser As New Model.LoginEnity '将用户界面输入的用户名和密码赋值给实体中 LUser.UserName = txtUserName.Text.Trim() LUser.PassWord = txtPassword.Text.Trim() '实例化B层,在这跳转到B层 Dim BCheck As New system_BLL.UserLoginBLL '判断能否能够成功登陆 If BCheck.CheckUser(LUser) = True Then MsgBox("登录成功!") Else MsgBox("登录失败!请检查用户名和密码是否正确!") End If End SubEnd Class
二、B层代码
B层代码和之前的三层登陆例子的代码很相似,唯一不同的是,B层接收到所传回来的值是从工厂中传来的,而不是D层!
Imports ModelImports IDALImports system_FactoryPublic Class UserLoginBLL ''' <summary> ''' 判断用户是否能够成功登陆 ''' </summary> ''' <param name="User"></param> ''' <returns></returns> ''' <remarks></remarks> Public Function CheckUser(ByVal User As Model.LoginEnity) As Boolean '实例化这个工厂 Dim factory As New Factory_Login '定义BIUser为数据库查询中返回的值 Dim BIUser As New List(Of Model.LoginEnity) '定义BIUser为工厂方法中的返回值 BIUser = Factory_Login.CreateUserInfo.check(User) '判断是否存在这个用户名 If BIUser.Count = 0 Then Return False Else Return True End If End FunctionEnd Class
三、接口
脑补下什么是接口:接口——(百度百科)在这里我理解的接口相当于外部我想要一个判断用户名是否存在的功能,通过接口寻找内部具体实现的这个功能的方法!
Imports ModelPublic Interface IUserInfo ''' <summary> ''' 定义一个连接数据库的接口,check方法是验证是否能够成功登陆 ''' </summary> ''' <param name="userEnity"></param> ''' <returns></returns> ''' <remarks></remarks> Function check(ByVal userEnity As Model.LoginEnity) As List(Of Model.LoginEnity)End Interface
四、抽象工厂
抽象工厂就是封装了一个个不同的实现判断用户是否存在这个功能,具体的实现方法不一样,但是最终要达到的效果是一样的!(可能理解的不是很到位,大家多批评指点)
Imports IDALImports System.ReflectionImports System.ConfigurationPublic Class Factory_Login ''' <summary> ''' 用户登陆的工厂方法 ''' </summary> ''' <returns></returns> ''' <remarks></remarks> Public Shared Function CreateUserInfo() As IUserInfo '定义AssemblyName作为D层的程序集名称 Static Dim AssemblyName As String AssemblyName = "DAL" '定义db为连接配置文件 Dim db As String db = System.Configuration.ConfigurationManager.AppSettings("DBString") '定义className为D层的根命名空间 Dim className = AssemblyName + "." + db + "CheckUser" '定义iuser为接口,返回这个接口的方法 Dim iuser As IUserInfo iuser = CType(Assembly.Load(AssemblyName).CreateInstance(className), IUserInfo) Return iuser End FunctionEnd Class
在这AssemblyName,和ClassName具体的写法经常会遇到很多的问题,在这先不做介绍,请看系列文章
五、D层
这里放的就是具体的查询数据库的内容,这里使用到sqlhelper类,之前写到过,大家可以看下之前写到的博客点击打开链接
Imports IDALImports System.Data.SqlClientImports System.Collections.GenericImports Model''' <summary>''' 查询数据库,判断用户是否能够成功登陆''' </summary>''' <remarks></remarks>Public Class sqlCheckUser : Implements IDAL.IUserInfo Private ReadOnly sqlHelper As New SQLHelper Public Function Check(ByVal IUser As Model.LoginEnity) As List(Of Model.LoginEnity) Implements IDAL.IUserInfo.check '定义D层查询的返回值类型为Datatable Dim table As New DataTable '查询数据库中的信息,判断用户名是否存在 Dim sql As String = "select * from T_UserInfo where UserName=@UserName " Dim SqlParamete As SqlParameter() = {New SqlParameter("@UserName", IUser.UserName)} '给table赋值 table = sqlHelper.ExecSelect(sql, CommandType.Text, SqlParamete) '将查询出来的Datatable类型的数值转换成泛型集合的类型 Dim myList As List(Of Model.LoginEnity) myList = ModelHelper.convertToList(Of Model.LoginEnity)(table) Return myList End FunctionEnd Class
六、实体
Public Class LoginEnity '定义UserName的属性 Private _UserName As String Public Property UserName As String Get Return _UserName End Get Set(value As String) _UserName = value End Set End Property '定义Password的属性 Private _Password As String Public Property PassWord As String Get Return _Password End Get Set(value As String) _Password = value End Set End Property Private level As String Public Property UserLevel As String Get Return level End Get Set(value As String) level = value End Set End PropertyEnd Class
七、配置文件
书写配置文件时,需要注意一个很大的问题,就是区分大小写,key的值和value的值一定要区分大小写。
<?xml version="1.0" encoding="utf-8" ?><configuration><startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /></startup><appSettings><add key="ConnStr" value="Server=.; Database = cybercafe-sys;User=sa;Password=123456" /><add key="DBString" value ="sql"></add></appSettings></configuration>
小结:
万事开头难,调了很多天的代码,才算是把登陆给弄出来了,算是松了一口气,理解了之后发现其实挺简单的,需要自己动手实践!在写代码的过程中遇到了很多的问题和错误,在之后的系列文章中会一一介绍所出现问题的解决方法,大家记得关注哦!
- 抽象工厂+反射 登陆实例
- 登陆+抽象工厂+反射配置文件
- 登陆窗体 抽象工厂+反射
- 抽象工厂+反射 实例讲解
- 收费系统三层+抽象工厂+反射实例
- 三层之抽象工厂加反射实例
- 收费系统三层+抽象工厂+反射实例
- 三层之抽象工厂加反射实例
- 对抽象工厂+反射+配置文件的实例理解
- VB.NET三层登录实例(抽象工厂+反射+配置文件)
- 对抽象工厂+反射+配置文件的实例理解
- 抽象工厂反射
- 抽象工厂模式+反射
- 抽象工厂+反射+配置文件
- 抽象工厂+反射=反射工厂
- 抽象工厂模式:简单工厂模式、工厂方法模式对比;在工厂方法模式中使用反射创建对象实例
- c#抽象工厂实例
- 抽象工厂实例
- DAY-1 java基础-java面向对象
- 冒泡排序
- hdu 1255 覆盖的面积(扫描线)
- HDU 1686 Oulipo(KMP)
- poj 2186 Popular Cows(强连通缩点)
- 抽象工厂+反射 登陆实例
- HDU 3123 GCC (取模运算)
- 归并排序思路
- 网络经济与企业管理
- 类似SCSF中EventBroker解耦事件调用方和接受方,打破"+="带来的耦合
- 黑马学习视频-OC-block
- The die is cast (DFS 双重)
- Nginx防蜘蛛爬虫处理
- 二叉排序树的创建