一口乙個設計模式 職責鏈模式

2021-06-20 12:18:00 字數 3396 閱讀 8116

在完成了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...

設計模式 職責鏈模式

今天跟大家分享下設計模式中的職責鏈模式。不知道大家在學習職責鏈模式的時候是否感覺困難。我剛開始學的時候就被整暈了。呵呵,進入正題。職責鏈模式是物件行為型模式中比較有特點的設計模式了,的確有意思,它可以像資料結構中煉表一樣傳遞。其實生活中好多的行為方式都體現了職責鏈模式,我們初期學習者可以把職責鏈模式...