现在的位置: 首页 > 综合 > 正文

设计模式——责任链模式(chain of responsbility)

2013年10月30日 ⁄ 综合 ⁄ 共 3729字 ⁄ 字号 评论关闭

 设计模式------责任链模式(chain of responsbility)

 

基本职能:

       就是使多个对象都可以处理请求,避免请求发送者与接收者之间更多的耦合关系。将接收者串成一条链,将请求延一个方向顺序递送,直到有接收者处理他。


 

Rose中相关的UML图如下

 

 

 

应用地方:

1.         多个对象处理一个请求,多个对象在运行时指定。

2.         在不明确接收者的情况下递交多个请求。

3.         运行时判断拿一个接收者处理这个请求。

 

实例:

1.自动售货机,自动辨认1元,5毛,1毛的硬币。
       只有一个投币口,我们投入硬币,由他来辨认。这就是典型的责任链模式。

C#语言实现

CoinData.cs

using System;

 

namespace ChianOfResponsibility

{

       public class CoinData

       {

              private bool m_Succeed;

              private int m_nValue;

 

              public CoinData(int nValue)

              {

                     m_nValue=nValue;

              }

 

              public int Value

              {

                     get

                     {

                            return m_nValue;

                     }

              }

 

      

              public bool Succeed

              {

                     get

                     {

                            return m_Succeed;

                     }

                     set

                     {

                            m_Succeed=value;

                     }

              }

 

              public override string ToString()

              {

                     return "Coin:"+Value;

              }

       }

}

 

Coin10.cs

using System;

 

namespace ChianOfResponsibility

{

      

       public class Coin10:IHandler

       {

              public Coin10()

              {

                    

              }

 

              public CoinData CoinValue(CoinData data)

              {

                     data.Succeed=(data.Value==10);

                     return data;

              }

       }

}

 

Coin100.cs

namespace ChianOfResponsibility

{

      

       public class Coin100:IHandler

       {

              public Coin100()

              {

                    

              }

 

              public CoinData CoinValue(CoinData data)

              {

                     data.Succeed=(data.Value==100);

                     return data;

              }

       }

}

 

Coin50.cs

namespace ChianOfResponsibility

{

       public class Coin50:IHandler

       {

              public Coin50()

              {

                    

              }

 

              public CoinData CoinValue(CoinData data)

              {

                     data.Succeed=(data.Value==50);

                     return data;

              }

       }

      

}

CoinChain.cs

 

namespace ChianOfResponsibility

{

       public class CoinChain

       {

              private CoinChain()

              {

                    

              }

 

              private static IHandler[] m_handlers= {

                                                                                    new Coin100(),

                                                                                           new Coin10(),new Coin50()

                     };

 

              public static CoinData Solve(CoinData dt)

              {

                     foreach(IHandler h in m_handlers)

                     {

                            CoinData ret=h.CoinValue(dt);

                            if(ret.Succeed)

                            {

                                   return ret;

                            }

                     }

                     throw new ApplicationException("Not such coin.");

              }

       }

}

 

IHandler.cs

 

namespace ChianOfResponsibility

{

       interface IHandler

       {

              CoinData CoinValue(CoinData data);

       }

}

 

TestClass.cs

using System;

 

namespace ChianOfResponsibility

{

      

       class TestClass

       {

              [STAThread]

              static void Main(string[] args)

              {

                     CoinData dt=new CoinData(100);

                     Console.WriteLine(CoinChain.Solve(dt));

                     dt=new CoinData(10);

                     Console.WriteLine(CoinChain.Solve(dt));

                     dt=new CoinData(50);

                     Console.WriteLine(CoinChain.Solve(dt));

                     dt=new CoinData(30);

                     Console.WriteLine(CoinChain.Solve(dt));

              }

       }

}

抱歉!评论已关闭.