zoukankan      html  css  js  c++  java
  • 思想上移,行动下移——抽象工厂+反射+配置文件

      从网上查找资料的时候发现非常多同学都写过这篇博客了。可见我的方向没有跑偏。尽管我们学设计模式的时候已经接触过抽象工厂模式,大话设计模式中每一个设计模式都紧密联系生活,并且主人公讲的也相当有趣,可是真正运用起来却没那么简单。能够说小菜仅仅是帮我们理解了各个设计模式的用途以及优缺点,真正的理解还须要我们自己动手实践。

      为什么要用抽象工厂?

      主要就是为了提高软件的灵活性,运用抽象工厂+反射+配置文件能够非常方便的更换数据库。引入接口之后,就能够对外提供一致的接口,而我们既能够用SQLServer实现接口,也能够用AccessDAL实现,能够更好地为B层和D层解耦合。

      

      如何用于抽象工厂呢?

      我们就以机房收费系统用户登录为例。解说怎样详细运用:

      这里我们用的是SQLServer数据库。配置文件例如以下:

      

    <span style="font-family:KaiTi_GB2312;font-size:18px;">  <appSettings>
        <add key ="DB" value="Sqlserver"/>
        <add key="ConnStr" value="server=.;database=JFSF_Recharge;User ID=sa;Password=123456"/>
      </appSettings></span>
        U层负责接收和输出数据信息,通过B层的返回值显示用户是否登陆成功。

    <span style="font-family:KaiTi_GB2312;font-size:18px;">    Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click
            If IsEmptyText(Me) = True Then '调用遍历函数推断文本框和选择框是否为空
                Exit Sub
            Else
                Dim thisUser As Entity.LoginModel = New Entity.LoginModel '定义一个实体对象来获得文本框的内容
                thisUser.user_name = txtUserid.Text.Trim()
                thisUser.user_pwd = txtPassword.Text
    
                Dim ub As BLL.Loginbll = New BLL.Loginbll '定义一个B层对象,通过B层返回结果,通知用户信息
                If ub.IsUser(thisUser) Then
                    MessageBox.Show("登陆成功,欢迎使用!")
                    Me.Hide()
                    frmmain.Show()
                Else
                    MessageBox.Show("登录失败,请又一次输入!")
                    Call NotEmptyText(Me)
                End If
            End If
        End Sub</span>

      B层是逻辑处理层,进行逻辑推断和放置功能函数。

    <span style="font-family:KaiTi_GB2312;font-size:18px;">    Public Function IsUser(ByVal user As Entity.LoginModel) As Boolean
            Dim factory As New Factory.DBFactory
            '定义一个接口变量
            Dim IUser As IUserInfo
            '调用查找用户的工厂方法
            IUser = factory.FindUser
            Dim table As DataTable
            Dim flag As Boolean
            table = IUser.QueryUserInfo(user)
            If table.Rows.Count = 0 Then
                flag = False
            Else
                flag = True
            End If
            Return flag
        End Function</span>

      Factory层应用配置文件和反射技术实现灵活更换数据库功能,更换数据库的过程在这里就是一个拼接字符串。

    <span style="font-family:KaiTi_GB2312;font-size:18px;">    Private Shared ReadOnly AssemblyName As String = "DAL" '声明程序集的名称
        Private Shared ReadOnly db As String = ConfigurationManager.AppSettings("DB") '读取配置文件
        Public Function FindUser() As IDAL.IUserInfo
            Dim className As String = AssemblyName + "." + db + "LoginDAL" '定义类名初值为DAL.SqlserverLoginDAL
            Dim iuser As IUserInfo
            iuser = CType(Assembly.Load(AssemblyName).CreateInstance(className), IUserInfo) '使用反射
            Return iuser
        End Function</span>

      IDAL层中写好我们须要的父类方法。通过DAL层实现。

    <span style="font-family:KaiTi_GB2312;font-size:18px;">Public Interface IUserInfo
        '查询用户的接口函数  
        Function QueryUserInfo(ByVal user As Entity.LoginModel) As DataTable
    End Interface</span>

      D层重写IDAL层的方法,借助于SQLHelper实现对username和password的查询。

    <span style="font-family:KaiTi_GB2312;font-size:18px;">Public Class SqlserverLoginDAL : Implements IUserInfo '实现接口函数
    
        '重写接口中查找用户方法
        Function QueryUserInfo(ByVal user As Entity.LoginModel) As DataTable Implements IUserInfo.QueryUserInfo
            Dim strSQL As String = "select * from User_info where userName= @username and passWord=@password"
            Dim Params() As SqlParameter = {New SqlParameter("@username", user.user_name), New SqlParameter("@password", user.user_pwd)}
            Dim helper As New SqlHelper
            Dim dbuser = helper.GetDataTable(strSQL, CommandType.Text, Params)
            Return dbuser
        End Function
    
    End Class</span>

      运用抽象工厂。可以大大的减少B层和D层之间的耦合,使我们可以灵活的更换数据库,更好地满足用户的需求。纸上得来终觉浅,得知此事要躬行,理论上的真理还须要实践来验证。

  • 相关阅读:
    SDUT OJ 河床
    BZOJ 1500: [NOI2005]维修数列( splay )
    BZOJ 2049: [Sdoi2008]Cave 洞穴勘测( LCT )
    BZOJ 3401: [Usaco2009 Mar]Look Up 仰望( 单调栈 )
    BZOJ 1552: [Cerc2007]robotic sort( splay )
    BZOJ 1251: 序列终结者( splay )
    BZOJ 1576: [Usaco2009 Jan]安全路经Travel( 树链剖分 )
    BZOJ 3408: [Usaco2009 Oct]Heat Wave 热浪( 最短路 )
    BZOJ 3403: [Usaco2009 Open]Cow Line 直线上的牛( deque )
    BZOJ 3407: [Usaco2009 Oct]Bessie's Weight Problem 贝茜的体重问题( dp )
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5060237.html
Copyright © 2011-2022 走看看