思考問題:(模擬班遊集體請假),學校規定:對於班遊,學生提交的申請表,必須經過輔導員、系主任、院長、校長簽名確認才能出遊,現在由你來設計該業務模型模擬該需求,應該如何設計?
解答:很直觀的一種想法:我直接設計乙個學生類、乙個申請單類requestnote、乙個輔導員類、乙個系主任類、乙個院長類、乙個校長類,然後為每個類新增審核方法verify(requestnote rn);
然後設定規則:
1. 當輔導員審核通過就呼叫系主任的verify方法,不通過就返回不再向下呼叫。
2. 系主任審核通過就呼叫院長verify方法,否則不再向下呼叫;
3. 依次類推;
很好,這已經是接近責任鏈模式了,因為已經形成了一條鏈;
可優化一下,你會發現上面輔導員類、系主任類、院長類和校長類都有乙個公共的verify方法和下乙個處理類的引用,為了規範和結構清晰,我們是不是應該設計乙個抽象類,新增verify抽象方法和下乙個處理類的引用,讓子類繼承呢?
但是下乙個處理類怎麼表示?你會發現除了學生,其他人的身份都相似都是領導leader,所以設計乙個leader類,建構函式中傳入下乙個處理者的物件,新增乙個verify方法和乙個leader引用(代表下乙個處理類)
學生類的submitreq方法中呼叫乙個leader(輔導員)的verify方法,表示學生向輔導員提交申請(構造輔導員時需要先傳入系主任物件,構造系主任時需要傳入院長物件,構造院長時需要傳入校長物件);
例項**:
leader抽象類:
package com.shusheng.chain.responsibility;
public
abstract
class
leader
輔導員類:
package com.shusheng.chain.responsibility;
/**輔導員類*/
public
class
instructor
extends
leader
@override
public
boolean
verify(requestnote rn)
}
系主任類:
package com.shusheng.chain.responsibility;
/**系主任*/
public
class
departmenthead
extends
leader
@override
public
boolean
verify(requestnote rn)
}
package com.shusheng.chain.responsibility;
/**學院院長*/
public
class
dean
extends
leader
@override
public
boolean
verify(requestnote rn)
}
package com.shusheng.chain.responsibility;
/**校長類*/
public
class
president
extends
leader
@override
public
boolean
verify(requestnote rn)
}
package com.shusheng.chain.responsibility;
/**模擬申請表*/
public
class
requestnote
package com.shusheng.chain.responsibility;
/**學生把申請表提交給輔導員*/
public
class
student
}
package com.shusheng.chain.responsibility;
public
class responsibilitychaintest
}
目錄結構:
輸出結果:
責任鏈模式 行為型
使用場景 1 如果有多個物件可以處理同乙個請求,但是具體由哪個物件來處理該請求,是執行時刻動態確定的。這種情況可以使用職責鏈模式,把處理請求的物件實現成為職責物件,然後把它們構成乙個職責鏈,當請求在這個鏈中傳遞的時候,具體由哪個職責物件來處理,會在執行時動態判斷。2 如果你想在不明確指定接收者的情況...
設計模式 行為型 責任鏈模式
從擊鼓傳花談起 擊鼓傳花是一種熱鬧而又緊張的飲酒遊戲。在酒宴上賓客依次坐定位置,由一人擊鼓,擊鼓的地方與傳花的地方是分開的,以示公正。開始擊鼓時,花束就開始依次傳遞,鼓聲一落,假如花束在某人手中,則該人就得飲酒。擊鼓傳花的類圖結構如下 如果用乙個物件系統描述賈府,那麼賈母 賈赦 賈政 賈寶玉和賈環等...
設計模式 行為型 責任鏈模式
責任鏈 chain of responsibility 模式為請求建立了乙個接收者物件的鏈。這種模式給予請求的型別,對請求的傳送者和接收者進行解耦。這種型別的設計模式屬於行為型模式。使用場景 乙個請求物件需要多種任務的處理,通過鏈式傳播物件的場景。優點1.職責鏈對於客戶請求是透明的 2.鏈 將請求的...