标签:设计模式
最近机房收费系统的重构完成了,尽管就用了两个设计模式,但是却还是感觉怪怪的,总感觉外观有问题,知道昨天实验了一个晚上,才发现自己是哪里错了,现在就把我认为正确的外观介绍给大家。
什么是外观。
简单的说就是一组借口,用来连接客户端与复杂功能实现的一组借口,防止客户端与子系统内部产生耦合,从而导致客户程序随着子系统的变化也要发生变化,我们就用了一个外观模式这个借口来实现他。
为什么要用呢?
大家在编程的时候有时候会遇到这么一个问题,比如最简单的登陆来说吧,我们会先进行卡号的查询,如果卡号通过了,在进行密码的查询,两项都通过了,才能进入权限,所以我们在客户端的代码中就会调用两个方法,然后再注册的时候,我们同样需要判断这两项是否存在,这个方法又需要调用两遍,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
说到底,外观在我看来就是一个借口,为了复用,为了让我们客户端的维护更容易的接口,也许他让业务逻辑更复杂一些,程序的执行稍慢一点,却完全不能掩饰他为我们带来的好处,那就是代码的简洁。标签:设计模式
原文地址:http://blog.csdn.net/lovemenghaibin/article/details/38754353