首页 > 代码库 > 简单的外观模式

简单的外观模式

最近机房收费系统的重构完成了,尽管就用了两个设计模式,但是却还是感觉怪怪的,总感觉外观有问题,知道昨天实验了一个晚上,才发现自己是哪里错了,现在就把我认为正确的外观介绍给大家。

什么是外观。

简单的说就是一组借口,用来连接客户端与复杂功能实现的一组借口,防止客户端与子系统内部产生耦合,从而导致客户程序随着子系统的变化也要发生变化,我们就用了一个外观模式这个借口来实现他。

为什么要用呢?

大家在编程的时候有时候会遇到这么一个问题,比如最简单的登陆来说吧,我们会先进行卡号的查询,如果卡号通过了,在进行密码的查询,两项都通过了,才能进入权限,所以我们在客户端的代码中就会调用两个方法,然后再注册的时候,我们同样需要判断这两项是否存在,这个方法又需要调用两遍,2遍看上去不是很多,那如果三个方法呢,四个方法的组合呢,所以我们就会想到把这几个方法封装成一个方法,所以外观模式就应运而生了。

下面我们来看一看如果不用外观是什么样子的。例如一个登陆的Demo,我们需要两个方法,判断用户名和用户密码。

那么再看看用了外观是什么样子的。

代码如下

方法

 '验证用户是否存在
    Public Function IsExist(ByVal user As Entity.Userinfo) As Boolean
        Dim iuser As IDAL.IUser
        Dim factory As New Factory.DataAccess
        Dim mylist As New List(Of Entity.Userinfo)
        '调用工厂的方法创建出一个接口
        iuser = factory.CreateUser()
        '调用借口的方法,返回值给List这个泛型集合
        mylist = iuser.QueryUserinfo(user)
        If mylist.Count = 0 Then

            MsgBox("用户名输入错误")
            Return False
        Else
            Return True
        End If

    End Function

    '验证密码是否正确
    Public Function ConfirmPwd(ByVal user As Entity.Userinfo) As Boolean
        Dim Iuser As IDAL.IUser
        Dim factory As New Factory.DataAccess
        '利用抽象工厂+反射调用一个接口方法
        Iuser = factory.CreateUser()
        Dim mylist As New List(Of Entity.Userinfo)
        '根据登陆的用户名来查询密码,返回给List
        mylist = Iuser.QueryUserinfo(user)
        '如果用户名正确
        If mylist.Count = 1 Then
            '如果密码正确
            If mylist.First.PWD = user.PWD Then
                Return True
                ' 错误的话
            Else
                MsgBox("密码错误")

            End If
        End If
    End Function
外观层

    ''' <summary>
    ''' 登陆的外观
    ''' </summary>
    ''' <param name="user">传入的用户名和密码</param>
    ''' <returns>Boolean</returns>
    ''' <remarks></remarks>
    Public Function login(ByVal user As Entity.Userinfo) As Boolean
        Dim confirmBLL As New BLL.LoginBLL
        Dim flag As Boolean
        ' 查询用户名方法
        flag = confirmBLL.IsExist(user)
        '查询密码方法
        flag = confirmBLL.ConfirmPwd(user)

        Return flag
    End Function
客户端

     Dim euser As New Entity.Userinfo                                '实例化新的UserInfo,用来传递B层的实体
            '传入参数
            euser.UserName = txtUserName.Text.Trim                          '将用户名传递给实体层的UserName
            euser.PWD = txtPwd.Text.Trim                               '将密码传递给实体层的PWD

            '调用外观层,判断登陆
            Dim LoginUI As New Facade.UserFac
 
            If LoginUI.login(euser) = True Then

                MsgBox("登陆成功")
            Else
                Exit Sub

            End If
说到底,外观在我看来就是一个借口,为了复用,为了让我们客户端的维护更容易的接口,也许他让业务逻辑更复杂一些,程序的执行稍慢一点,却完全不能掩饰他为我们带来的好处,那就是代码的简洁。

简单的外观模式