責任鏈模式的理解實例

這幾天在學習基本的23種設計模式,今天正好學習到,下面將自己的實際小例子代碼奉上:

 

下面的代碼演示的是: 病人去醫院看病所 透漏出來的 責任鏈模式。

                                          總的過程是,一個病人生病,然後去看病,有很多可以看病的醫生(牙醫,外科等),最後病人看病的結果只有兩種,看或者沒看

上代碼,請看裏面的註釋

namespace ConsoleApplication1.Test2
{
    class DutyModeTest
    {
        public void Testhandler()
        {
            //事件--生病
            Ill ill = new Ill();
            ill.IllName = "神經";
            toothHandler toothhandler = new toothHandler();
            StomachHandler stomachhandler = new StomachHandler();
            toothhandler.nextIll = stomachhandler;
            if (toothhandler.TreatIllOper(ill))
            {
                Console.WriteLine(ill.IllName+"已經解決");
            }
            else
            {
                Console.WriteLine(ill.IllName + "未解決");
            }
            Console.Read();
        }
    }

 

 

    //病
    public class Ill
    {
        public string IllName { get; set; }
        public string IllDesp { get; set; }
    }

 

 

    //抽象處理者角色
    public abstract class TreatIllHandler
    {
        //定義一個下家的引用
        protected TreatIllHandler _nextIll; 

        //定義一個抽象的處理方法 看病
        public  abstract bool TreatIllOper(Ill ill);

        //調用此方法,設置和獲取下家的引用
        public TreatIllHandler nextIll
        {
            set { _nextIll = value; }
            get { return _nextIll; }
        }
    }

 


    //具體處理者角色(牙疼治療)
    public class toothHandler : TreatIllHandler
    {

        public override bool TreatIllOper(Ill ill)
        {
            if (ill.IllName == "牙痛")
            {
                Console.WriteLine("牙痛治療");
                return true;
            }
            else
            {
                Console.WriteLine("不是牙痛,處理不了");
                if (nextIll != null)
                {
                    return nextIll.TreatIllOper(ill);
                }
            }
            return false;
        }
    }


    //具體處理者角色(胃疼治療)
    public class StomachHandler : TreatIllHandler
    {
        public override bool TreatIllOper(Ill ill)
        {
          
            if (ill.IllName == "胃痛")
            {
                Console.WriteLine("胃痛治療");
                return true;
            }
            else
            {
                Console.WriteLine("不是胃痛,處理不了");
                if (nextIll != null)
                {
                    return nextIll.TreatIllOper(ill);
                }
            }
            return false;
        }
    }
}

運行的結果:

 

思考: 1.如果我將ill.IllName = "牙痛"; 他將出現如下結果:

               也就是說,責任處理者的順序,決定了,這個流程要走幾遍,換個角度來說,要是責任鏈很長,我們是不是應該採取某種策略,儘量使他少遍歷責任處理者呢

             2.要是 這個人生了好n種病,那麼他是不是要 將這樣的模式走完n遍,或者是這種模式不適合,兼職的事件,那麼該如何改進呢

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章