码迷,mamicode.com
首页 > 其他好文 > 详细

大话设计模式-职责链模式

时间:2018-12-05 21:45:12      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:ret   职责   多个   handle   requests   request   str   foreach   地方   

职责链模式

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。

将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

技术分享图片

职责链模式的好处

当客户提交一个请求时,请求时艳链传递直至有一个具体处理者负责处理他。

接收者和发送者都没有地方的明确信息,且链中对象自己也不知道链的结构。

结果是职责链可简化对象的相互连接,他们仅需保持一个指向其后继者的引用,而不需保持他所有的候选者的引用。

随时地增加或修改处理一个请求的结构,增强了给对象指派职责的灵活性。

不过一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理。

 


 

职责链模式结构演示

抽象请求

定义一个处理请求的接口。

abstract class Handler
{
    protected Handler successor;
    public void SetSuccessor(Handler successor)=>this.successor=successor;
    public abstract void HandleRequest(int request);
}

具体请求

具体处理者类,负责处理他负责的请求,可访问它的后继者,如何可以处理就处理,否则就将请求交给他的后继者。

class ConcreteHandler1 : Handler
{
    public override void HandleRequest(int request)
    {
        if (request >= 0 && request < 10)
            Console.WriteLine($"{GetType().Name}处理请求{request}");
        else if (successor != null)
            successor.HandleRequest(request);
    }
}
class ConcreteHandler2 : Handler
{
    public override void HandleRequest(int request)
    {
        if (request >= 10 && request < 20)
            Console.WriteLine($"{GetType().Name}处理请求{request}");
        else if (successor != null)
            successor.HandleRequest(request);
    }
}
class ConcreteHandler3 : Handler
{
    public override void HandleRequest(int request)
    {
        if (request >= 20 && request < 30)
            Console.WriteLine($"{GetType().Name}处理请求{request}");
        else if (successor != null)
            successor.HandleRequest(request);
    }
}

测试结果

Handler h1 = new ConcreteHandler1();
Handler h2 = new ConcreteHandler2();
Handler h3 = new ConcreteHandler3();
h1.SetSuccessor(h2);
h2.SetSuccessor(h3);
//处理请求
int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 };
foreach (var request in requests)
    h1.HandleRequest(request);
//测试结果
ConcreteHandler1处理请求2
ConcreteHandler1处理请求5
ConcreteHandler2处理请求14
ConcreteHandler3处理请求22
ConcreteHandler2处理请求18
ConcreteHandler1处理请求3
ConcreteHandler3处理请求27
ConcreteHandler3处理请求20

 

大话设计模式-职责链模式

标签:ret   职责   多个   handle   requests   request   str   foreach   地方   

原文地址:https://www.cnblogs.com/errornull/p/10073458.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!