機房合作 狀態模式與上機

2021-09-23 21:37:39 字數 4237 閱讀 2257

在機房收費系統中,有幾個業務邏輯是比較複雜的,比如說上機、下機。記得我在做第一版vb收費系統的時候,還特別地將上下機拿出來畫了乙個完整的流程圖,要不這樣做的話,最後的結果一定是懵了,也不想再繼續寫**了。

在進行設計模式的學習之前,我們很有必要將上機這一業務邏輯完整的梳理一遍。

一.上機業務邏輯

1.判斷卡號是否存在

2.判斷卡號是否使用

3.判斷卡號餘額是否充足

4.判斷卡號是否正在上機

5.執行上機,新增上機記錄

這樣一羅列,很明顯,執行上機這一業務操作需要先經過四次判斷。之前我們都是通過乙個有乙個的if...else...語句去解決問題。

毫無疑問,這在物件導向的程式設計中是不允許出現的。而為了解決這樣需要重複使用大量if語句的這一問題,gof為我們提供了方案,那就是「狀態模式」。

在開始將其與機房結合之前,首先還是先複習何為「狀態模式」。

二.狀態模式理論

狀態模式(state)

,當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。

狀態模式主要解決的是當控制乙個物件轉換的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,可以把複雜的判斷邏輯簡化。

光從上面的專業化的語言去看,實在不清楚何時該用狀態模式。不過等你看到了下面我將總結的使用狀態模式的好處,一定沒有問題了。

狀態模式的好處

將與特定狀態相關的行為區域性化,並且將不同狀態的行為分隔開來。說白了,目的就是為了消除龐大的條件分支語句,大的分支判斷會使得它們難以修改和擴充套件。

狀態模式通過把各種狀態轉移到邏輯分布到state的子類之間,來減少相互間的依賴。

下面是其原始的類圖:三.利用狀態模式的上機通過上面對狀態模式的複習,很明顯,首先,我們需要先定義乙個抽象的狀態類;其次,我們必須把各個具體的狀態類確定,而這些子類,其實正是我們需要做的乙個個的判斷;最後,我們需要乙個維護各個具體狀態類的例項,這個例項定義當前的狀態。

下面是加狀態模式的上機類圖:

從圖中也可以很清楚的看到,乙個抽象類,五個具體類,乙個例項維護類。

五個具體類,即為上機要完成的事項,而在例項維護類下,我定義了乙個初始的狀態,即為判斷卡號是否存在。如果滿足,則在具體狀態類下改變狀態,繼續執行下乙個狀態的判斷。

下面是部分**:上機的抽象類:

public class cardonlinestatebll

''' ''' 卡號上機狀態抽象類——胡志婷——2023年8月7日08:54:26

'''

''' 上機

''' 上機記錄實體

''' 卡學生檢視實體

'''

public overridable sub online(byval online as cardonlinebll, byval enlinerecord as entity.linerecordentity, byval enstdcard as entity.stucardviewentity)

end sub

end class

卡號是否存在的具體狀態類:

public class i***istcardbll : inherits cardonlinestatebll

private myfacotry as new abstractfactory.abstractfactory.datasql

private icard as idal.icard

''' ''' 上機狀態 判斷卡號是否存在——胡志婷——2023年8月7日09:12:22

'''

''' 上機

''' 上下機實體

''' 學生卡檢視實體

'''

public overrides sub online(online as cardonlinebll, enlinerecord as entity.linerecordentity, enstdcard as entity.stucardviewentity)

mybase.online(online, enlinerecord, enstdcard)

dim factory as abstractfactory.abstractfactory.datasql = new abstractfactory.abstractfactory.datasql

dim icard as idal.istucardview

icard = factory.createstudentcardview()

dim cardlist as new list(of entity.stucardviewentity)

cardlist = icard.getstucardinfobycardid(enstdcard.cardno)

if cardlist.count = 0 then

throw new exception("該卡號不存在,無法上機")

else

online.setstate(new iscancelcardbll) '呼叫下乙個狀態,判斷卡號是否使用

online.online(enlinerecord, enstdcard) '呼叫上機方法

end if

end sub

end class

維護狀態類的例項:
public class cardonlinebll

''' ''' 定義乙個狀態變數——胡志婷——2023年8月7日08:59:14

'''

'''

'''

private state as cardonlinestatebll

''' ''' 建構函式,初始化上機初始狀態為判斷卡號是否存在——胡志婷——2023年8月7日09:00:07

'''

'''

public sub new()

state = new i***istcardbll()

end sub

''' ''' 設定狀態——胡志婷——2023年8月7日09:00:41

'''

''' 通過傳入的狀態改變上機狀態

'''

'''

public function setstate(byval onlinestate as cardonlinestatebll) as cardonlinestatebll

state = onlinestate '當前狀態賦值給變數state

return onlinestate '返回當前狀態

end function

''' ''' 上機——胡志婷——2023年8月7日09:01:41

'''

''' 上下機表實體

''' 學生卡檢視實體

'''

'''

public function online(byval enlinerecord as entity.linerecordentity, byval enstdcard as entity.stucardviewentity) as boolean

dim onlines as cardonlinebll = new cardonlinebll '例項化上機類

dim flag as boolean = false '定義初始值為false

trystate.online(onlines, enlinerecord, enstdcard) '呼叫上機狀態類方法

flag = true '上機成功

catch ex as exception

throw new exception(ex.message) '捕捉上機異常,並丟擲異常

end try

return flag '返回結果

end function

end class

其實,對於設計模式的學習,自己一直都覺得很迷糊,也不知道該如何在機房中去應用。但機房合作是一次很好的機會,和大家一起去討論我們可以如何在機房中去加上它們,順帶就把設計模式再學習了一遍,而這樣實踐性的學習效果和之前理論的學習效果是完全不同層次上的。所以,還是需要去嘗試,不能從心裡想著困難而不再嘗試了,也不要等著別人去給你講,那樣可能會是無限制的等待...

機房合作 狀態模式與上機

在機房收費系統中,有幾個業務邏輯是比較複雜的,比如說上機 下機。記得我在做第一版vb收費系統的時候,還特別地將上下機拿出來畫了乙個完整的流程圖,要不這樣做的話,最後的結果一定是懵了,也不想再繼續寫 了。在進行設計模式的學習之前,我們很有必要將上機這一業務邏輯完整的梳理一遍。一.上機業務邏輯 1.判斷...

機房合作 狀態模式進行上機判斷

在機房收費系統中自我感覺上機是需要條件判斷最多的乙個功能,要判斷 1 卡號是否存在 2 密碼是否正確 3 該卡是否能用 4 該卡是否已經上機 5 卡裡面是不是有錢。暫時僅我自己就能想到了這麼多判斷,如果還是按照以前的寫法的話,要寫多少的if.else.呢,全都羅列在一起也不符合物件導向的思想,所以,...

單例模式 機房合作

單例模式,保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。對於單例模式的概念和作用大家可以去問度哥,這篇文章主要將的是如何使用單例模式實現窗體的唯一。先說說我的歷程吧。看了 大話設計模式 感覺看懂了。然後就開始畫時序圖,主窗體在呼叫子窗體前先要經過乙個判斷類,判斷該窗體是否已經別例項化。根據...