分享

设计模式之职责链(Chain of Resposibility) c#

 荷露叮咚 2007-06-25
设计模式之职责链(Chain of Resposibility) c#
 

设计模式之职责链(Chain of Resposibility)

Author: 李艳庆
Date: 2005年11月11日

职责链是多个类共同处理一个请求.当A类不能处理时则传递给B类,B类不能处理时传递给C类,依次传下去,直到处理或所有类遍历一次.
也就是说当一个类不能处理一个请求时,就把该请求传给它的下家,下家不能处理,再传给它的下下家.
例如显示某个数值,每个类呢,都有一个显示范围,判断是否在这个范围内,在则显示,不在就传给它的下家.
建立一个抽象的处理类.所有处理类继承于它.
public abstract class ShowNumber
{
     protected ShowNumber show;
     public void SetNextHandler(ShowNumber show)
     {
         this.show = show;
     }
     public abstract void ShowRequest(int number);
}
下面为四个简单的处理类:
public class ShowNumber1 : ShowNumber
{
     public override void ShowRequest(int number)
     {
         if ((number >= 0) && (number < 250))
         {
             Console.WriteLine(number.ToString());
         }
         else if(show != null)
         {
             show.ShowRequest(number);
         }
     }
}
public class ShowNumber2 : ShowNumber
{
     public override void ShowRequest(int number)
     {
         if ((number >= 250) && (number < 500))
         {
             Console.WriteLine(number.ToString());
         }
         else if(show != null)
         {
             show.ShowRequest(number);
         }
     }
}
public class ShowNumber3 : ShowNumber
{
     public override void ShowRequest(int number)
     {
         if ((number >= 500) && (number < 750))
         {
             Console.WriteLine(number.ToString());
         }
         else if(show != null)
         {
             show.ShowRequest(number);
         }
     }
}
public class ShowNumber4 : ShowNumber
{
     public override void ShowRequest(int number)
     {
         if ((number >= 750) && (number < 1000))
         {
             Console.WriteLine(number.ToString());
         }
         else if(show != null)
         {
             show.ShowRequest(number);
         }
     }
}

调用时,依次将处理类联结.最后由第一个处理类处理.
public class Client
{
     public static void Main()
     {
         ShowNumber show1 = new ShowNumber1();
         ShowNumber show2 = new ShowNumber2();
         ShowNumber show3 = new ShowNumber3();
         ShowNumber show4 = new ShowNumber4();
         show1.SetNextHandler(show2);
         show2.SetNextHandler(show3);
         show3.SetNextHandler(show4);
         show1.ShowRequest(300);
     }
}

当第一个处理类不能处理时,会传给第二个处理类,第二个处理类可以处理

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约