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