模式設計c#--行為型--Chain of Responsibility
| 名稱 | Chain of Responsibility |
| 結構 |
|
| 意圖 | 使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關系。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它為止。 |
| 適用性 |
|
Code Example
namespace?ChainOfResponsibility_DesignPattern

{
????using?System;
????abstract?class?Handler?
????
{
????????protected?Handler?successorHandler;
????????abstract?public?void?HandleRequest(Request?request);????????
????????public?void?SetSuccessor(Handler?sucessor)
????????
{
????????????successorHandler?=?sucessor;
????????}
????}
????class?ConcreteHandler1?:?Handler
????
{
????????override?public?void?HandleRequest(Request?request)
????????
{
????????????//?determine?if?we?can?handle?the?request
????????????if?(request.RequestType?==?1)?//?some?complex?decision?making!
????????????
{
????????????????//?request?handling?code?goes?here
????????????????Console.WriteLine("request?handled?in?ConcreteHandler1");
????????????}
????????????else?
????????????
{
????????????????//?not?handled?here?-?pass?on?to?next?in?the?chain
????????????????if?(successorHandler?!=?null)
????????????????????successorHandler.HandleRequest(request);
????????????}
????????}
????}
????class?ConcreteHandler2?:?Handler
????
{
????????override?public?void?HandleRequest(Request?request)
????????
{
????????????//?determine?if?we?can?handle?the?request
????????????if?(request.RequestType?==?2)?//?some?complex?decision?making!
????????????
{
????????????????//?request?handling?code?goes?here
????????????????Console.WriteLine("request?handled?in?ConcreteHandler2");
????????????}
????????????else?
????????????
{
????????????????//?not?handled?here?-?pass?on?to?next?in?the?chain
????????????????if?(successorHandler?!=?null)
????????????????????successorHandler.HandleRequest(request);
????????????}
????????}
????}
????class?ConcreteHandler3?:?Handler
????
{
????????override?public?void?HandleRequest(Request?request)
????????
{
????????????//?determine?if?we?can?handle?the?request
????????????if?(request.RequestType?==?3)?//?some?complex?decision?making!
????????????
{
????????????????//?request?handling?code?goes?here
????????????????Console.WriteLine("request?handled?in?ConcreteHandler3");
????????????}
????????????else?
????????????
{
????????????????//?not?handled?here?-?pass?on?to?next?in?the?chain
????????????????if?(successorHandler?!=?null)
????????????????????successorHandler.HandleRequest(request);
????????????}????????
????????}
????}
????class?Request?
????
{
????????private?int?iRequestType;
????????private?string?strRequestParameters;
????????public?Request(int?requestType,?string?requestParameters)
????????
{
????????????iRequestType?=?requestType;????
????????????strRequestParameters?=?requestParameters;
????????}
????????public?int?RequestType?
????????
{
????????????get?
????????????
{
????????????????return?iRequestType;
????????????}
????????????set?
????????????
{
????????????????iRequestType?=?value;
????????????}
????????}
????}

????/**////?<summary>
????///????Summary?description?for?Client.
????///?</summary>
????public?class?Client
????
{
????????public?static?int?Main(string[]?args)
????????
{
????????????//?Set?up?chain?(usually?one?need?to?be?done?once)
????????????Handler?firstHandler?=?new?ConcreteHandler1();
????????????Handler?secondHandler?=?new?ConcreteHandler2();
????????????Handler?thirdHandler?=?new?ConcreteHandler3();
????????????firstHandler.SetSuccessor(secondHandler);
????????????secondHandler.SetSuccessor(thirdHandler);
????????????//?After?setting?up?the?chain?of?responsibility,?we?can
????????????//?now?generate?requests?and?pass?then?off?to?the?
????????????//?chain?to?be?handled
????????????//?generate?and?fire?request
????????????Request?newRequest?=?new?Request(2,"This?are?the?request?parameters");
????????????firstHandler.HandleRequest(newRequest);
????????????
????????????return?0;
????????}
????}
}
另一個很好的例子:

/**//*****************************************************?
*?一個責任鏈模式例子?
*該例子是三類售貨員處理訂單的情況?
*如果訂單金額小于1000,則一級售貨員可以處理該訂單?
*如果訂單金額小于10000,則二級售貨員可以處理該訂單?
*如果訂單金額小于100000,則三級售貨員可以處理該訂單?
******************************************************/?
?
using?System;?
?
/**//**//**////?<summary>?
///售貨員接口,所有類型的售貨員必須實現該接口?
///?</summary>?
interface?ISalesMan?

{?
????string?Name?
{set;get;}?//售貨員名字?
????void?SetNext(ISalesMan?nextSalesMan);?//設置下一級售貨員?
????void?Process(Order?order);?//處理訂單?
}?
?
/**//**//**////?<summary>?
///?訂單類?
///?</summary>?
class?Order?

{?
????private?int?orderAmount;?
?
????public?int?Amount?
????
{?
????????set
{?this.orderAmount?=?value;}?
????????get
{?return?this.orderAmount;?}?
????}?
}?
?
/**//**//**////?<summary>?
///?一類售貨員?
///?</summary>?
class?FirstSalesMan?:?ISalesMan?

{?
????private?ISalesMan?nextSalesMan?=?null;?
????private?string?name?=?string.Empty;?
?
????ISalesMan?成員ISalesMan?成員#region?ISalesMan?成員?
?
????public?string?Name?
????
{?
????????get?
????????
{?
????????????//?TODO:??添加?FirstSalesMan.Name?getter?實現?
????????????return?this.name;?
????????}?
????????set?
????????
{?
????????????this.name?=?value;?
????????}?
????}?
?
????public?void?SetNext(ISalesMan?nextSalesMan)?
????
{?
????????this.nextSalesMan?=?nextSalesMan;?
????}?
?
????public?void?Process(Order?order)?
????
{?
????????if(order.Amount?<?1000)?
????????????Console.WriteLine("{0}?Process?the?order,the?mount?of?this?order?is:?{1}",this.name,order.Amount);?
????????else?if(this.nextSalesMan?!=?null)?
????????????nextSalesMan.Process(order);?
????}?
?
????#endregion?
}?
?
/**//**//**////?<summary>?
///?二類售貨員?
///?</summary>?
class?SecondSalesMan?:?ISalesMan?

{?
????private?ISalesMan?nextSalesMan?=?null;?
????private?string?name?=?string.Empty;?
?
????ISalesMan?成員ISalesMan?成員#region?ISalesMan?成員?
?
????public?string?Name?
????
{?
????????get?
????????
{?
????????????//?TODO:??添加?FirstSalesMan.Name?getter?實現?
????????????return?this.name;?
????????}?
????????set?
????????
{?
????????????this.name?=?value;?
????????}?
????}?
?
????public?void?SetNext(ISalesMan?nextSalesMan)?
????
{?
????????this.nextSalesMan?=?nextSalesMan;?
????}?
?
????public?void?Process(Order?order)?
????
{?
????????if(order.Amount?<?10000)?
????????????Console.WriteLine("{0}?Process?the?order,the?mount?of?this?order?is:?{1}",this.name,order.Amount);?
????????else?if(this.nextSalesMan?!=?null)?
????????????nextSalesMan.Process(order);?
????}?
?
????#endregion?
}?
?
/**//**//**////?<summary>?
///?三類售貨員?
///?</summary>?
class?ThirdSalesMan?:?ISalesMan?

{?
????private?ISalesMan?nextSalesMan?=?null;?
????private?string?name?=?string.Empty;?
?
????ISalesMan?成員ISalesMan?成員#region?ISalesMan?成員?
?
????public?string?Name?
????
{?
????????get?
????????
{?
????????????//?TODO:??添加?FirstSalesMan.Name?getter?實現?
????????????return?this.name;?
????????}?
????????set?
????????
{?
????????????this.name?=?value;?
????????}?
????}?
?
????public?void?SetNext(ISalesMan?nextSalesMan)?
????
{?
????????this.nextSalesMan?=?nextSalesMan;?
????}?
?
????public?void?Process(Order?order)?
????
{?
????????if(order.Amount?<?100000)?
????????????Console.WriteLine("{0}?Process?the?order,the?mount?of?this?order?is:?{1}",this.name,order.Amount);?
????????else?if(this.nextSalesMan?!=?null)?
????????????nextSalesMan.Process(order);?
????}?
?
????#endregion?
}?
?
class?Client?

{?
????public?static?void?Main(string[]?args)?
????
{?
????????FirstSalesMan?first?=?new?FirstSalesMan();?
????????first.Name?=?"firstMan";?
?
????????SecondSalesMan?second?=?new?SecondSalesMan();?
????????second.Name?=?"secondMan";?
?
????????ThirdSalesMan?third?=?new?ThirdSalesMan();?
????????third.Name?=?"thirdMan";?
?
????????first.SetNext(second);?
????????second.SetNext(third);?
?
????????Order?o?=?new?Order();?
????????o.Amount?=?300;?
????????first.Process(o);?
?
????????o?=?new?Order();?
????????o.Amount?=?1300;?
????????first.Process(o);?
?
????????o?=?new?Order();?
????????o.Amount?=?11300;?
????????first.Process(o);?
?
????????Console.Read();?
????}?
}?posted on 2006-01-03 16:06 夢在天涯 閱讀(778) 評論(1) 編輯 收藏 引用 所屬分類: Design pattern

