在完成了vb.net版的機房收費系統後,感覺自己對物件導向的認識實在是太少了,所以在網上蒐集各種相關資料,添補這塊知識的空白。
這不,經過乙個上午的思索,終於把職責鏈模式加入了機房收費系統,進一步加深對物件導向思想的認識。
有需求才有動力,在完成機房收費系統時,有個計算消費時間的函式,當時功能是實現了,但沒有體會到物件導向的思想,所以在此進行重構。
當我們計算消費時間onlinetime時,需要將onlinetime和準備時間preparetime、至少上機時間leasttime、單位遞增時間increasetime進行比較。如果消費時間小於準備時間,則消費時間為0;如果消費時間大於準備時間小於至少上機時間,則消費時間為至少上機時間;如果消費時間大於至少上機時間,則按收費標準進行收費。
如果用if……else實現上述邏輯,**混亂程度可想而知。如果我們用職責鏈模式實現,則思路變得非常清晰。職責鏈的核心就是按著一條鏈,依次執行,直到有物件處理了此事。
要想用職責鏈模式實現上述邏輯,首先我們要在準備時間、至少上機時間、單位遞增時間的基礎上進行抽象,抽象出抽象類onlinetimehandler,上邊三者分別繼承onlinetimehandler抽象類。
其中,抽象類onlinetimehandler**如下:
public mustinherit class onlinetimehandler
'獲得的消費時間
protected onlinetime as integer
'設定上下級
property calculate as onlinetimehandler
'設定onlinetimehandler下級
public sub setnext(byval calculate as onlinetimehandler)
me.calculate = calculate
end sub
'處理申請 mustoverride抽象
public mustoverride function request(byval onlinetime as integer) as integer
end class
準備時間preparetimehandler類**如下:public class preparetimehandler : inherits onlinetimehandler
private preparetime as integer
public sub new(byval preparetime as integer)
me.preparetime = preparetime
end sub
public overrides function request(byval onlinetime as integer) as integer
'如果上機時間小於準備時間,則上機時間為0,否則把資訊傳遞到它的下屬
if onlinetime <= preparetime then
return 0
else
return calculate.request(onlinetime)
end if
end function
end class
至少上機時間leasttimehandler類**如下:public class leasttimehandler : inherits onlinetimehandler
private leasttime as integer
public sub new(byval leasttime as integer)
me.leasttime = leasttime
end sub
public overrides function request(byval onlinetime as integer) as integer
'如果上機時間小於最少時間,則上機時間為最少時間,否則把資訊傳遞到它的下屬
if onlinetime < leasttime then
return leasttime
else
return calculate.request(onlinetime)
end if
end function
end class
單位遞增時間increasetimehandler類**如下:public class increasetimehandler : inherits onlinetimehandler
private increasetime as integer
public sub new(byval increasetime as integer)
me.increasetime = increasetime
end sub
public overrides function request(byval onlinetime as integer) as integer
return onlinetime
end function
end class
程式main函式:sub main()
'宣告三個物件,並為物件設定初值
dim a as new preparetimehandler(2)
dim b as new leasttimehandler(5)
dim c as new increasetimehandler(10)
'設定a的下屬為b,b的下屬為c
a.setnext(b)
b.setnext(c)
'測試console.writeline(a.request(1))
console.writeline(a.request(3))
console.writeline(a.request(6))
end sub
這樣,我們設定準備時間為2,至少上機時間為5,單位遞增時間為10。當消費時間為1時,preparetimehandler類直接處理掉此事,結果為0;當消費時間為3時,preparetimehandler無法處理此事,把資訊傳遞到它的下屬leasttimehandler類,leasttimehandler可以處理此事,結果為5;當消費時間為6時,資訊傳遞到increasetimehandler類,它處理此事。
輸入結果如下:
通過上述過程,實現了職責鏈的功能。
希望我的講解能對大家有所幫助。
設計模式 職責鏈模式
2008年08月17日 星期日 下午 04 28 using system using system.collections.generic using system.text public officer officer o public abstract void deal action a c...
設計模式 職責鏈模式
1 request.h ifndef request h define request h include include using namespace std class request 請求類定義 endif request h 2 manager.h ifndef manager h def...
設計模式 職責鏈模式
今天跟大家分享下設計模式中的職責鏈模式。不知道大家在學習職責鏈模式的時候是否感覺困難。我剛開始學的時候就被整暈了。呵呵,進入正題。職責鏈模式是物件行為型模式中比較有特點的設計模式了,的確有意思,它可以像資料結構中煉表一樣傳遞。其實生活中好多的行為方式都體現了職責鏈模式,我們初期學習者可以把職責鏈模式...