关闭

设计模式版三层登录小例子

标签: 设计模式vb.net
2896人阅读 评论(130) 收藏 举报
分类:

          引言

   在前面两篇博客中对小例子进行了不同语言和参数的编写,但是感觉还是有点没有尽兴,于是就想到前面学到的设计模式,之前只是把理论学习了,还没有实践,正好就拿着这个小例子开刀了,于是就有了这篇博客的由来。

     加什么设计模式?

  有了想法以后,这么多设计模式我应该加哪一个呢?就在自己的记忆深处回想小菜和大鸟的故事,根据我的那六个兄弟(设计模式六原则),最后决定给这小东西加上一个外观和抽象工厂+反射+配置文件。

    加上设计模式后的变化!

  首先看看我的设计模式都加在了什么地方:

      

      先来看看我的解决方案的布局:

                                     

     下面首先看看我加上外观以后U层的变化:


 现在我的U层不在和B层直接交互,也就是说U层不在管B层中有多少个类,而我现在直接和外观交互就可以,很好避免这样一个问题——当我们U层完成一个动作需要很多B层的类的时候,我们需要在U层中New很多次的问题,另外当我们改动U层或者B层的时候它们两个不在互相影响,外观类很好的解除了U层和B层的耦合。

 再让大家看一下我的工厂的代码:

Public Class FacadeLogin
    '实例化一个LoginManager ,调用UserLogin
    Dim manager As BLL.LoginManager = New BLL.LoginManager()

    Dim F As Boolean  '用来往U层传参

    Public Function Login(ByVal user As Entity.UserInfoET) As Boolean
        F = manager.Check(user)

        Return F

    End Function

End Class

下面看看我加上抽象工厂+反射+配置文件以后的变化

  B层:

              

D层:

Imports System.Reflection
Imports System.Data.SqlClient
Imports System.Configuration
Imports IDAO
Public Class DalUserInfoSql : Implements IDAO.IUserInfo        '实现接口
    Public Function Check(ByVal user As Entity.UserInfoET) As Entity.UserInfoET Implements IDAO.IUserInfo.Check  '实现接口中的方法
        Dim strConnStr As String = System.Configuration.ConfigurationManager.AppSettings("ConnStr")
        Dim conn As SqlConnection = New SqlConnection(strConnStr)
        Dim sql As String = "SELECT ID,UserName,Password,Email FROM USERS WHERE UserName =@UserName AND Password = @Password"
        Dim cmd As SqlCommand = New SqlCommand(sql, conn)

        cmd.Parameters.Add(New SqlParameter("@UserName", user.UserName))
        cmd.Parameters.Add(New SqlParameter("@Password", user.Password))

        conn.Open()
        Dim reader As SqlDataReader = cmd.ExecuteReader()

        Dim Buser As Entity.UserInfoET = New Entity.UserInfoET()  '实例化Buser往B层传参

        While (reader.Read())
            Buser.UserName = reader.GetString(1)
            Buser.Password = reader.GetString(2)
        End While

        Return Buser




    End Function
End Class


接口:

Public Interface IUserInfo

    Function Check(ByVal IUser As Entity.UserInfoET) As Entity.UserInfoET

End Interface
首先解释一下为什么我在D层和B层之间加了一个接口?这样做有什么好处?那么我应该弄清楚接口的作用——给外界提供一个统一的访问形式,我们在接口中声明了所有的方法,在具体的类中来实现,这就要求我我们的类中的方法的名称和接口中的一样,下面来看一张类图:


                                

    现在假定我们的D层中有这么两个连接数据库的类,现在我们就可以实例化一个接口类A,然后在根据需求在让A来实例化一个D层中的具体的类(A=new 类名),因为方法名都是一样的,我们就没有必要在关心具体类中方法名不同的问题,但是这仍然不能满足开放——封闭原则,那就是当我们更换数据库的时候,还得改动B层?

   要想解决这个问题,我们就需要我们的工厂+反射+配置文件了

工厂:

<pre name="code" class="vb">Imports System.Reflection       '引用反射机制
Imports IDAO
Public Class DFactory
  
    Dim strDB As String = System.Configuration.ConfigurationSettings.AppSettings("DBString")
    Function CreateUserInfo() As IUserInfo
        Return CType(Assembly.Load("DAL").CreateInstance("DAL.DalUserInfo" & strDB), IUserInfo)
        'CType是一个内联函数,将前部分的表达式转换为后面的类型
    End Function
End Class



配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <appSettings>
    <add key="ConnStr" value ="Data Source=晓;Initial Catalog=Login;User ID=sa;Pwd=123456"></add>
    <add key="DBString" value ="Sql"></add>
  </appSettings>
</configuration>

 有了这两个机制,当我们在更换数据库的时候就直接在配置文件了更改就可以了!

 

  小结

  对于敲这个小例子的这三遍,每一遍都有不同的收获,对于三层的理解也发生了很大的改变,经历了好奇——不通——熟悉——升华这么几个阶段,每一遍都用断点一步一步的跟踪,使我们思路更加的清晰。希望能在重构的时候更灵活的运用。



 

1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

初识MVC——MVC与三层/MVC与设计模式

题记:对于刚接触项目的菜鸟来说,MVC是一个新鲜的东西,浅显的知道MVC是分为MODEL、View和controler层,于是觉得它与我们曾经用到的三层架构相似,于是就错误的混到了一起。由于想要知道它...
  • u012581322
  • u012581322
  • 2015-12-16 21:53
  • 818

设计模式VS三层架构

在之前我们接触过设计模式.那么三层架构和设计模式之间到底有什么样的联系呢?   一.回顾设计模式          设计模式遵循的设计原理为"高内聚,低耦合".设计模式的核心思想是代码的可重用...
  • tang_huan_11
  • tang_huan_11
  • 2013-01-22 21:29
  • 2811

架构(三层架构)、框架(MVC)、设计模式三者异同点

架构、框架、设计模式三者关系与异同点、三层架构与MVC的区别——chenchen
  • u010191034
  • u010191034
  • 2014-04-27 15:05
  • 3328

WEB开发三层架构及MVC设计模式概述

关于   三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦...
  • qq_16526497
  • qq_16526497
  • 2015-07-29 08:33
  • 1681

【三层】-C#版登录例子

背景:学习三层架构也有段时间了,之前觉得三层挺轻松的,就一集王继彬老师的视频,对三层有了大概的了解,通过后来的登录例子的实现,渐渐体会到没有想象中的那么简单,三层架构的学习不能仅仅停留在理论的概念层面...
  • zt15732625878
  • zt15732625878
  • 2016-03-13 20:42
  • 549

VB.NET版三层登录小例子

在上一篇博客中的开篇就介绍了实体的作用,但是上一篇中的用C#敲的那个三层登录的小例子中并没有用实体作为参数来传递,因为小例子中的参数很少就两三个,刚刚接触三层就为了练习三层的思想就没有用实体来穿参,昨...
  • u013045437
  • u013045437
  • 2014-12-09 17:48
  • 1355

C#版三层登录小例子

实体层    我在这先简单介绍一下实体层,这是一个处在“三界之外”的东西,它不属于任何一层,但是任何一层都和它有关联,为什么会在三层中出现这么一层呢?其实这一层就是在经典三层传送数据的,避免三层之间...
  • u013045437
  • u013045437
  • 2014-12-07 17:04
  • 1190

传统三层向DDD的转变及以DDD为开发模式的设计开发步骤

传统三层向DDD的转变:实体见引入合理的关联。根据需要引入聚合。将DAL命名的类换成Repository命名。将BAL命名的类换成Service。将BAL中的一些职责重构到Domain中。引入Appl...
  • sven_xu
  • sven_xu
  • 2015-06-02 09:22
  • 2035

C# 使用三层架构实例演示-winForm 窗体登录功能

数据库: 名称:threeLayer 表:
  • qq649792393
  • qq649792393
  • 2014-11-24 19:32
  • 4381

三层架构实例—用户登录窗体

前面我们对三层结构有一个简单的认知,明白了三层结构包括的内容以及各层之间的关系,下面在VS2010中创建一个三层架构的项目。 此例子以vb.net 为例,因为是写给初接触三层的人看的,我会尽量的将过程...
  • jin870132
  • jin870132
  • 2014-03-21 15:14
  • 2610
    个人资料
    • 访问:533939次
    • 积分:18199
    • 等级:
    • 排名:第600名
    • 原创:272篇
    • 转载:20篇
    • 译文:0篇
    • 评论:5656条
    和我交谈
    点击这里给我发消息 点击这里给我发消息
    时间你好?
    博客专栏
    最新评论