這幾天在學習基本的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遍,或者是這種模式不適合,兼職的事件,那麼該如何改進呢