經過放假6天的調整,過年後,大家又可以整裝待發,一起奮鬥,一起迎接新一年的挑戰了,祝大家日子過得猴開心!!程式設計的猴賽雷!!~~
今天總結一下職責鏈模式,以及職責鏈模式在機房下機中的應用。
使多個物件都有機會處理請求,從而避免請求的傳送者和接受者之間的耦合關係。將這個物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有乙個物件處理它為止。
自己的理解:這個模式為什麼稱之為職責鏈模式,在公司中,每個人的職責許可權都是不同的,我們不能越權去處理一些事情,每個許可權解決事物的條件不同,就拿請假來說吧,我請2小時假,紀委有權利批給我,但是如果我要請兩天的假,紀委就沒有權利批給我了,我就要去找公尺老師,這樣這個請求就會一層一層的被傳遞下去,知道遇到有許可權處理我這個問題的人。再說說其中的解耦作用,比如在公司中,有上千個人,我需要辦一件事情,向離我最近的乙個部門提出乙個請求,之後,這個請求就會被傳遞下去知道解決為止,而這個」我「,是不知道最終問題是被哪乙個部門所解決的,這就達到了解耦的目的。
首先這三種情況是層層遞進的關係,我們需要三個類來處理三種不同的情況,實際時間傳入第乙個類,滿足條件,直接處理,不滿足條件,則傳遞給其他繼承類,知道處理完成。那麼我們來看看機房中的類圖怎麼畫:
首先要定義乙個抽象類(timehandlerbll),這個類是個處理時間的介面,下邊三個子類分別繼承這個抽象類,還定義了乙個外觀類,來分擔u層**負擔,同時使得u層和b層解耦,起到例項化物件和傳參的作用。
ui:
dim cardlineinfo as new entity.linerecordentity
cardlineinfo.logouttime = timeofday.toshorttimestring '給上機記錄實體附上下機時間
cardlineinfo.logintime = txtonlinetime.text.tostring
dim logouttime as string = cardlineinfo.logouttime '定義變數存放下機時間
dim offfacade as new facade.onlinetimefacade '呼叫外觀層,獲取消費時間
dim basicdata as list(of entity.basicdata)
dim userbll as new bll.userbll
basicdata = userbll.getbasiclist '得到基礎資料
dim consumetime as integer = offfacade.costtime(basicdata, cardlineinfo) '呼叫外觀,併入引數
facade:
public function costtime(byval basicdata as list(of entity.basicdata), lineinfo as entity.linerecordentity) as integer
'例項化,通過建構函式,傳遞引數
dim bpreparetime as new preparetimehandlerbll(basicdata)
dim bleasttime as new bleasttimehandlerbll(basicdata)
dim baddtime as new unittimehandlerbll(basicdata)
bpreparetime.setsuccessor(bleasttime) '設定下乙個繼承者
bleasttime.setsuccessor(baddtime)
'dim line as new entity.linerecordentity
time = datediff("n", lineinfo.logintime, lineinfo.logouttime)
return bpreparetime.handletime(time)
end function
b-timehandlerbll:抽象類
public mustinherit class timehandlerbll '抽象基類
protected successor as timehandlerbll
public sub setsuccessor(byval successor as timehandlerbll) '設定繼承類
me.successor = successor
end sub
public mustoverride function handletime(byval time as integer) as integer '處理請求的抽象方法
end class
b-preparetimehandlerbll:準備時間
public class preparetimehandlerbll : inherits timehandlerbll
dim preparetime as integer
public sub new(byval enbasicdata as list(of entity.basicdata)) '建構函式,傳入準備時間值
me.preparetime = cint(enbasicdata(0).preparetime)
end sub
public overrides function handletime(time as integer) as integer
if time <= preparetime then '如果上機時間小於準備時間,返回0
return 0
else
return successor.handletime(time) '否則轉到下一位繼承者
end if
end function
end class
public class bleasttimehandlerbll : inherits timehandlerbll '至少上機時間處理
private leasttime as integer
public sub new(byval basicdata as list(of entity.basicdata))
me.leasttime = cint(basicdata(0).limitedtime) '將基礎資料賦給leasttime這個變數
end sub
public overrides function handletime(time as integer) as integer
if time <= leasttime then
return leasttime
else
return successor.handletime(time)
end if
end function
end class
unittimehandlerbll
public class unittimehandlerbll : inherits timehandlerbll '單位時間計算
private unittime as integer
public sub new(byval basicdata as list(of entity.basicdata))
me.unittime = cint(basicdata(0).addtime)
end sub
public overrides function handletime(time as integer) as integer
return math.abs(int(-time / unittime)) * unittime
end function
end class
完成這一功能,更多的是借鑑大神們的部落格,因為在敲上機的時候,我是自己敲得,深知不用設計模式的痛苦,而下機需要呼叫的資料又非常的多,邏輯判斷算的上整個機房系統中最複雜的一部分,所以就看了很多很多師哥師姐們的部落格,雖然少了一些自己對這個模式如何應用到機房中,和應該應用到機房中的哪個部分少了些思考,但是在借鑑的過程中,對這乙個設計模式由最開始的模模糊糊,到現在的實際應用,也學到了不少的東西。 C 機房重構 下機(職責鏈模式)
職責鏈模式 職責鏈 當客戶提交乙個請求時,請求是沿著鏈傳遞,直至有乙個concretehandler物件負責處理,接收者和傳送者都滅有對方的明確資訊,且鏈中的物件自己也並不知道鏈的結構,僅需保持乙個指向其後繼者的引用。具體實現 在機房重構中職責鏈主要用於確定學生的消費時間,以下為具體的實現 抽象類p...
C 機房重構 下機之職責鏈模式
前言 說到設計模式,又熟悉又陌生,為什麼這麼說呢?熟悉是因為學過設計模式,明白了當時學習的例子 陌生是因為放到重構不會用,參考了很多部落格,才知道如何用這個職責鏈模式。內容 bll層 沒有設計準備時間,上機滿一分鐘即收費。public class chainbll public decimal co...
重構 下機 職責鏈模式
使用者下機,進行金錢和時間的計算,需要進行多重判斷 在責任鏈模式裡,很多物件由每乙個物件對其下家的引用而連線起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某乙個物件決定處理此請求。發出這個請求的客戶端並不知道鏈上的哪乙個物件最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織和分配責...