場景:白眉大俠與江湖
描述:江湖綠林道與開封府。小喽兵與小寨主,小七傑可以辦案。俠客要小五義。劍客要劍客對付。
(一)開封府
public abstract class KaiFentFu
{
protected KaiFentFu _kaifeng;
public void SetHandler(KaiFentFu kaifeng)
{
_kaifeng = kaifeng;
}
public abstract void Handle(LuLin lulin);
}
(二)小七傑,小五義,小五義老師
public class XiaoQiJie : KaiFentFu
public override void Handle(LuLin lulin)
if (lulin.LulinType == eType.loubing || lulin.LulinType == eType.zhaizhu)
{
Console.WriteLine("小小喽兵和小寨主,小七傑可以處理了!");
}
else
{
if (_kaifeng != null)
_kaifeng.Handle(lulin);
public class XiaoWuYi : KaiFentFu
if (lulin.LulinType == eType.xiake)
Console.WriteLine("俠客,小五義可以處理了!");
public class JianKe : KaiFentFu
if (lulin.LulinType == eType.jianke)
{
Console.WriteLine("劍客,小五義的老師可以處理了!");
(三)綠林
public enum eType
{
loubing=0,
zhaizhu,
xiake,
jianke
public class LuLin
public string Name { get; set; }
public eType LulinType { get; set; }
(四)測試
public void TestChainOfResponsibility()
{
//小七傑,小五義,小五義老師
KaiFentFu _k1 = new XiaoQiJie();
KaiFentFu _k2 = new XiaoWuYi();
KaiFentFu _k3 = new JianKe();
_k1.SetHandler(_k2);
_k2.SetHandler(_k3);
List<LuLin> _list = new List<LuLin>();
_list.Add(new LuLin { LulinType = eType.jianke, Name = "劍客1" });
_list.Add(new LuLin { LulinType=eType.loubing,Name="小喽兵1"});
_list.Add(new LuLin { LulinType = eType.xiake, Name = "俠客1" });
_list.Add(new LuLin { LulinType = eType.zhaizhu, Name = "小寨主1" });
_list.Add(new LuLin { LulinType = eType.zhaizhu, Name = "小寨主2" });
_list.Add(new LuLin { LulinType = eType.jianke, Name = "劍客2" });
_list.Add(new LuLin { LulinType = eType.loubing, Name = "小喽兵21" });
foreach(LuLin ll in _list)
_k1.Handle(ll);
}
結果:
劍客,小五義的老師可以處理了!
小小喽兵和小寨主,小七傑可以處理了!
俠客,小五義可以處理了!
在軟體建構過程中,一個請求可能被多個對象處理,但是每個請求在運作時隻能有一個接受者,如果顯示指定,将必不可少地帶來請求發送者與接受者的緊耦合。
如何使請求的發送者不需要指定具體的接受者?讓請求的接受者自己在運作時決定來處理請求,進而使兩者解耦。
使多個對象都有機會處理請求,進而避免請求的發送者和接收者之間的耦合關系。将這些對象連成一條鍊,并沿着這條鍊傳遞該請求,直到有一個對象處理它為止。
這個例子裡,這個鍊沒有盡頭(沒有對全部可能的請求進行處理),它沒有對盡可能的請求做出處理。但在鍊的結尾,應當把請求處理完畢。
部落格園大道至簡
http://www.cnblogs.com/jams742003/轉載請注明:部落格園