职责链模式

  职责链模式模式(Chain of Responsibility): 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链, 并沿着这条链传递该请求, 直到有一个对象处理它为止。

  


  Handler 类, 定义一个处理请示的接口:

abstract class Handler{
    public Hanlder successor;

    protected void SetSuccessor(Handler handler){  //设置继任者
        this.successor = successor;
    }

    public abstract void HandleRequest(int request);  //处理请求的抽象方法
    } 

  ConcreteHandler 类, 具体处理类, 处理它所负责的请求, 可访问它的后继者, 如果可处理该请求,就处理之,否则就将该请求转发给它的后继者

 ConcreteHAndler1, 当请求数在1-10 之间则有权处理, 否则转到下一位

class ConcreteHandler1 : Handler{
     
     public override void HandlerRequest(int request){
     if(request >= 0 && request < 10){          //0-10 处理此请求
     Console.WriteLine("{0} 处理请求{1}", this.GetType().Name, request);
     }
     else if(successor != null) {
     successor.HAndleRequest(request);   //转移到下一位
     }
     }
    }

  ConcreteHandler2, 当请求数在10-20之间则有权处理,否则转移下一位

class ConcreteHandler2 : Handler{
     
     public override void HandlerRequest(int request){
     if(request >= 10 && request < 20){          //10-20 处理此请求
     Console.WriteLine("{0} 处理请求{1}", this.GetType().Name, request);
     }
     else if(successor != null) {
     successor.HAndleRequest(request);   //转移到下一位
     }
     }
    }

   ConcreteHAndler3 , 当请求数在20-30之间则有权处理,否则转移下一位

class ConcreteHandler3 : Handler{
     
     public override void HandlerRequest(int request){
     if(request >= 20 && request < 30){          //20-30 处理此请求
     Console.WriteLine("{0} 处理请求{1}", this.GetType().Name, request);
     }
     else if(successor != null) {
     successor.HAndleRequest(request);   //转移到下一位
     }
     }
    }

  客户代码,向链上的具体处理者对象提交请求

static void Main(string[] args){

    Handler h1 = new ConcreteHandler1();
    Handler h2 = new ConcreteHandler2();
    Handler h3 = new ConcreteHAndler3();
   
    h1.SetSuccesstor(h2);  //设置职责链上下家
    h2.SetSuccesstor(h3);   

    int[] request = {2,5,14,22,18,27};

    foreach(int request in requests) {  //循环给最小处理者提交请求, 不同的数额,有不同权限处理者处理
    h1.HandleRequest(request);
    }

    Console.Read();
     }

 职责链的好处:

  当客户提交一个请求时, 请求是沿链传递直至有一个ConcreteHandler 对象负责处理它。

  接收者和发送者都没有对方的明确信息, 且链中的对象自己也并不知道链的结构。 如果职责链可以简化对象的相互连接,它们仅需保持一个指向后继者的引用, 而不需要保持它所有的候选接受者的引用。这也就大大地降低了耦合

  由于是在客户端来定义链的结构, 故我们可以随时地增加或修改处理一个请求的结构。增强了给对象指派职责的灵活性。

  但也要注意: 一个请求很有可能到了链的末端都得不到处理, 或者因为没有正确配置而得不到处理。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值