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


        C#版的三层登陆实例,仅仅是为了学习三层而实现的。为了接下来须要进行的vb.net版机房收费系统。

    依据上次的C#改编的vb.net版本号登陆实例。只是在验收的时候发现了非常多问题。所以进行了改动。

       花费好几天的时间。最终从C#转化成了vb.net版本号。期间參考了一些师哥师姐的博客来理解三层是怎样交互的。

    起初上一篇实例,并非非常懂,仅仅是理解了个大概。然后依据那么多材料来进行对照。最终看懂他们是怎么进行操作的。

    就说看了那么多不相同式的实例之后,才知道谁的设计方案更好。知识是不变的。可是设计理念就能看出代码运行效率的高低。

     

       在使用三层的过程中,才干真正体会到。什么叫高内聚,低耦合。在程序发现错误之后。能把错误的细节定位到详细一层,甚至详细一类。

    只改动或更换这一类就能调试出来。使得调试代码的量变的极底。

    这就是使用三层的优点吧。

       下面是本实例的设计,这个实例 是模仿上篇实例得到的。所以名称有些不规范,请见谅。

     

    数据库还是使用的上次的数据可。没有变动。

     

    通过对实例的不断分解,单一职责划分。

    得到下图的引用关系。

     

    接下来看一下各个层次的代码:

     

    UI层:

     

    Public Class Form1
    
        Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
            Try
                Dim user1 As New Login.Moudel.UserInfoEntity
                Dim user2 As New Login.Moudel.UserInfoEntity    '使用user2来进行登陆
    
                user2.USERNAME = txtUserName.Text.Trim
                user2.PASSWORD = txtPassword.Text
    
                Dim mgr As New Login.BLL.LoginManager
                user1 = mgr.SelectUserLogin(user2)      '将登陆返回的结果存放到user1中
    
                MessageBox.Show("登陆用户:" + user1.USERNAME)       '通知用户登陆成功
            Catch ex As Exception
                MessageBox.Show(ex.Message.ToString())      '登陆失败,通知用户
            End Try
    
        End Sub
    
        '退出系统
        Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click
            End
        End Sub
    End Class


    B层:

    Public Class LoginManager
        Function SelectUserLogin(ByVal User As Login.Moudel.UserInfoEntity) As Login.Moudel.UserInfoEntity
            Dim bUser As LoginIDAL.IUser
            bUser = Factory.DataAccess.CreateUser()
    
            Dim rUser As New Login.Moudel.UserInfoEntity     '定义一个数据实体
    
            rUser = bUser.SelectUser(User)       '依据參数 查找数据库  并返回一个实体
    
    
            If IsNothing(rUser.USERNAME) Then       '推断username是否存在
                Throw New Exception("username 不存在")
            End If
    
            If rUser.PASSWORD = User.PASSWORD Then  '推断password是否正确
                Return rUser
            Else
                Throw New Exception("登陆失败,请检查usernamepassword")
            End If
        End Function
    End Class
    

    D层:

    Public Class DbConnStr
        Public Shared Function Connstring() As String
            Connstring = "Server=zc-pc;Database=UBDLogin;User ID=sa; Password=123456"
        End Function
    End Class
    

     

    Imports System.Data.SqlClient
    Imports System.Data
    
    Public Class SqlServerDAO : Implements LoginIDAL.IUser
        Function SelectUser(ByVal user As Login.Moudel.UserInfoEntity) As Login.Moudel.UserInfoEntity Implements LoginIDAL.IUser.SelectUser
            Dim conn As New SqlConnection           '创建链接对象
             Dim cmd As New SqlCommand               '创建命令对象
            conn = New SqlConnection(DbConnStr.Connstring())    '链接数据库
            cmd.Connection = conn
    
            cmd.CommandText = "Select * from Users Where UserName=@UserName" ' and Password=@Password"
            cmd.Parameters.Add(New SqlParameter("@UserName", user.USERNAME))
            'cmd.Parameters.Add(New SqlParameter("@Password", user.PASSWORD))
            cmd.CommandType = CommandType.Text
            conn.Open()
    
            Dim reader As SqlDataReader = cmd.ExecuteReader        '运行生成一个dataReader
            Dim rUser As New Login.Moudel.UserInfoEntity            '用于保存返回实体
    
            While (reader.Read())
                rUser.USERNAME = reader.GetString(1)
                rUser.PASSWORD = reader.GetString(2)
                rUser.LEVEL = reader.GetString(3)
                rUser.EMAIL = reader.GetString(4)
            End While
    
            Return rUser    '返回取出得到的实体
            conn.Close()
    
        End Function
    End Class
    

    IDAL:


     

    Public Interface IFactory          '工厂类
        Function CreateUser() As LoginIDAL.IUser
    End Interface
    Public Interface IUser
        Function SelectUser(ByVal user As Login.Moudel.UserInfoEntity) As Login.Moudel.UserInfoEntity
    End Interface


    Entity:

    Public Class UserInfoEntity
        Private _userID As String
        Private _userName As String
        Private _password As String
    
        Public Property USERNAME() As String     '属性username
            Get
                Return _userName
            End Get
            Set(value As String)
                _userName = value
            End Set
        End Property
    
        Public Property PASSWORD() As String   '属性usernamepassword
            Get
                Return _password
            End Get
            Set(value As String)
                _password = value
            End Set
        End Property
    
    
    End Class
    
    

    总结:三层架构,不过一种设计理念。

    帮助我们来优化代码。减少代码之间的耦合。只通过几天的学习。是不可能所有掌握的。这样的东西。就好比学习 面向对象的 思想, 须要在长期的实践 应用中,才干体会到里面的精髓。


  • 相关阅读:
    Can't locate ... in @INC
    c++写一个类后编译发现class重定义
    python with
    遍历Java Map
    mod_jk notes
    NPM使用总结
    Yeoman
    Java中的Marker Interfaces有什么用
    有关Ehcache的内容的引用和Java的deep copy
    JDBC的PreparedStatement语句使用记录
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/6738009.html
Copyright © 2020-2023  润新知