外觀設計模式,《大話設計模式》第103頁詳細講解,不記得這塊知識的小伙伴可以翻閱翻閱,看過設計模式,敲過書上的例子,只是學習的第一步,接著,如果在我們的項目中靈活應用,把設計模式用出花兒來,才是王道,有人總說,紙上得來終覺淺,絕知此事要躬行,可是真到了躬行的時候,總是行不通,語言倒不過來,設計模式是C#語言的,機房收費是VB.NET版本的,書上的模式和機房聯系不起來,不知道怎麼應用,沒辦法,憋呗,看博客,問人,上網查資料,就這樣,憋出一個外觀,雖不太完美,但卻異常寶貴,因為那是我糾結好長時間從塵埃裡開出的花,就外觀模式的應用在這裡小小的總結一下。
就機房收費系統中的一個注冊功能來說,著手之前,我們需要做以下思考工作:
a、從學生表裡查詢,是否存在該學號;
b、從卡表裡查詢,是否存在該卡號;
c、在學生表裡插入一條記錄;
d、在卡表裡插入一條記錄;
e、在充值表裡插入一條記錄;
在外觀層我的代碼如下:(該博文,重點闡述外觀層的寫法,其她層再此不再贅述)
<span style="font-size:18px;">'**********************************************
'文 件 名: RegisterFacade
'命名空間: Facade
'內 容: 從卡表和學生表裡面查詢是否存在該卡號和學號,存在,給出提示,不存在,注冊成功之後,一次向卡表,學生表和充值表中寫入相關信息
'功 能: 注冊
'文件關系:
'作 者:丁國華
'小 組:寶貝計劃
'生成日期: 2014/7/17 15:06:56
'版本號:V2.0
'修改日志:
'版權說明:
'**********************************************
Public Class RegisterFacade
'/// <summary>
'/// depiction:<從學生表裡面查詢是否存在該學號>
'/// </summary>
'/// <param name="<enStudent>"><學生實體></param>
'/// <returns>
'///<返回一個學生實體的集合>
'/// </returns>
Public Function QueryStudentNo(ByVal studentNo As String) As List(Of Entity.StudentEntity)
Dim studentBLL As New BLL.T_StudentBLL
Dim myList As List(Of Entity.StudentEntity)
myList = studentBLL.QueryStudentNo(studentNo)
If myList.Count > 0 Then
Throw New Exception("該學號已經存在")
Else
Return myList
End If
End Function
'/// <summary>
'/// depiction:<從卡表裡面查詢是否存在該卡號>
'/// </summary>
'/// <param name="<enCard>"><卡實體></param>
'/// <returns>
'///<返回一個卡實體的集合>
'/// </returns>
Public Function QueryCardNo(ByVal cardNo As String) As List(Of Entity.CardEntity)
Dim cardBLL As New BLL.T_CardBLL
Dim myList As List(Of Entity.CardEntity)
myList = cardBLL.QueryCardNo(CardNo)
If myList.Count > 0 Then
Throw New Exception("該卡號已經存在")
Else
Return myList
End If
End Function
'/// <summary>
'/// depiction:<插入一條學生信息>
'/// </summary>
'/// <param name="<enStudent>"><學生實體></param>
'/// <returns>
'///<返回布爾值>
'/// </returns>
Public Function InsertStudent(ByVal enStudent As Entity.StudentEntity) As Boolean
Dim StudentBLL As New BLL.T_StudentBLL
Dim flag As Boolean
flag = StudentBLL.InsertStudent(enStudent)
Return flag
End Function
'/// <summary>
'/// depiction:<插入一條卡信息>
'/// </summary>
'/// <param name="<enCard>"><卡實體></param>
'/// <returns>
'///<返回布爾值>
'/// </returns>
Public Function InsertCard(ByVal enCard As Entity.CardEntity) As Boolean
Dim CardBLL As New BLL.T_CardBLL
Dim flag As Boolean
flag = CardBLL.InsertCard(enCard)
Return flag
End Function
'/// <summary>
'/// depiction:<插入一條充值信息>
'/// </summary>
'/// <param name="<enRecharge>"><充值實體></param>
'/// <returns>
'///<返回布爾值>
'/// </returns>
Public Function InsertRecharge(ByVal enRecharge As Entity.RechargeEntity) As Boolean
Dim RechargeBLL As New BLL.T_RechargeBLL
Dim Flag As Boolean
Flag = RechargeBLL.InsertRecharge(enRecharge)
Return Flag
End Function
End Class
</span>
接著,我們再來看下一個充值的功能,著手之前,我們需要做一下思考工作:
a、從卡表裡面查詢,是否存在該卡號;
b、在充值表裡面插入一條充值記錄;
c、更新卡表中的余額
和上述的注冊功能相比較,兩個功能都需要從卡表裡面查詢和向充值表裡面插入一條記錄。所以充值這個功能,她的接口層(IDAL),D層(DAL),Factory-工廠層,BLL-業務邏輯層,她的代碼寫法和上述的注冊功能的寫法都是一樣的,我們就不需要在寫一次,直接調用就可以了,但是外觀層要怎麼寫呢,寫著寫著就寫不下去了,按著以前的寫法,只需要在外觀層寫一個更新卡表中余額的方法就行了,從卡表中查詢和在充值表中插入一條充值記錄,只需要調用注冊的外觀就可以了,可是,這樣寫的話,U層就調用了兩個外觀層,那還是外觀層麼?顯然不是,看人程傑老師的大話設計模式中,外觀的寫法是把小的方法匯總成一個總的方法,寫在一個大的方法裡面,那充值的外觀到底如何寫呢?如下:
<span style="font-size:18px;">'**********************************************
'文 件 名: RechargeFacade
'命名空間: Facade
'內 容:
'功 能:
'文件關系:
'作 者:丁國華
'小 組:寶貝計劃
'生成日期: 2014/7/18 22:18:04
'版本號:V2.0
'修改日志:
'版權說明:
'**********************************************
Public Class RechargeFacade
'/// <summary>
'/// depiction:<查詢卡號>
'/// </summary>
'/// <param name="<enCard>"><卡號></param>
'/// <returns>
'///<返回集合>
'/// </returns>
Public Function QueryCard(ByVal cardNo As String) As List(Of Entity.CardEntity)
Dim cardbll As New BLL.T_CardBLL
Dim mylist As List(Of Entity.CardEntity)
mylist = cardbll.QueryCardNo(cardNo)
If mylist.Count = 0 Then
Throw New Exception("該卡號不存在")
Else
Return mylist
End If
End Function
'/// <summary>
'/// depiction:<需要向卡表中插入一條記錄,更新卡表中的余額,我們把這兩個寫成一個方法,因為都需要返回一個布爾值>
'/// </summary>
'/// <param name="<enCard>"><卡號></param>
'/// <returns>
'///<返回集合>
'/// </returns>
Public Function Recharge(ByVal enCard As Entity.CardEntity, ByVal enRecharge As Entity.RechargeEntity) As Boolean
Dim CardBLL As New BLL.T_CardBLL
Dim RechargeBLL As New BLL.T_RechargeBLL
Dim Flag(2) As Boolean
Flag(0) = RechargeBLL.InsertRecharge(enRecharge)
Flag(1) = CardBLL.UpdateCard(enCard)
If Flag(0) And Flag(1) Then
Return Flag(0)
Else
Return False
End If
End Function
End Class
</span>
小伙伴肯定有疑問,上面注冊的外觀層不是仍然有兩個方法?簡單,解釋一下,因為,查詢卡號的時候,我們需要返回一個卡表的實體,然後從裡面找到以前的余額,然後還要加上充值的金額,形成一個新的余額,更新的時候才能有一個卡表實體,下面recharge的那個方我們的返回值boolean,true為充值成功,一個方法不可能有兩個返回值,所以寫成兩個方法,總的來說就是具體外觀層有幾個方法,是由返回值定的。第二遍機房收費系統,未完,待續......
作者:csdn博客 丁國華