天天看點

模式執行個體之——職責鍊執行個體

場景:白眉大俠與江湖

描述:江湖綠林道與開封府。小喽兵與小寨主,小七傑可以辦案。俠客要小五義。劍客要劍客對付。

(一)開封府

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/

轉載請注明:部落格園

繼續閱讀