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

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

引言


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


加什么设计模式?


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


加上设计模式后的变化!


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


20150225212507548.png

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

20141213144752046.jpg

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

20141213144940748.jpg


现在我的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层:


20141213150945296.jpg

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层之间加了一个接口?这样做有什么好处?那么我应该弄清楚接口的作用——给外界提供一个统一的访问形式,我们在接口中声明了所有的方法,在具体的类中来实现,这就要求我我们的类中的方法的名称和接口中的一样,下面来看一张类图:


20141213154354062.jpg

现在假定我们的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>

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


小结


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


目录
相关文章
|
4月前
|
设计模式 前端开发
二十三种设计模式全面解析-深入解析桥接模式:解锁软件设计的灵活性
二十三种设计模式全面解析-深入解析桥接模式:解锁软件设计的灵活性
|
4月前
|
设计模式 存储
二十三种设计模式全面解析-揭秘访问者模式:开启对象间灵活交互之门
二十三种设计模式全面解析-揭秘访问者模式:开启对象间灵活交互之门
|
4月前
|
设计模式
二十三种设计模式全面解析-解密中介者模式:构建灵活的通信桥梁
二十三种设计模式全面解析-解密中介者模式:构建灵活的通信桥梁
|
9月前
|
设计模式
设计模式中的六种关系以及代码之间的对应
设计模式中的六种关系以及代码之间的对应
92 0
设计模式中的六种关系以及代码之间的对应
|
11月前
|
设计模式 前端开发
前端通用编程基础的设计模式之适配器
在前端开发中,我们常常需要对外部库或者组件进行使用和集成。但是这些库或者组件的接口可能并不符合我们自己的需求,这时候就需要使用适配器模式来实现接口的转换和兼容。
94 0
|
设计模式 算法 API
常用设计模式的功能、关联和区别
常用设计模式的功能、关联和区别
|
设计模式 前端开发 Java
二十三天学会设计模式之中介模式
二十三天学会设计模式之中介模式
二十三天学会设计模式之中介模式
|
设计模式
23种设计模式-关系模式-责任链模式(十七)
23种设计模式-关系模式-责任链模式(十七)
23种设计模式-关系模式-责任链模式(十七)
|
设计模式 小程序
23种设计模式-关系模式-模板方法模式(十四)
23种设计模式-关系模式-模板方法模式(十四)
23种设计模式-关系模式-模板方法模式(十四)
|
设计模式 Java 调度
23种设计模式-关系模式-中介者模式(二十二)
23种设计模式-关系模式-中介者模式(二十二)
23种设计模式-关系模式-中介者模式(二十二)