博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
大话设计模式-职责链模式
阅读量:5149 次
发布时间:2019-06-13

本文共 1901 字,大约阅读时间需要 6 分钟。

职责链模式

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

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

职责链模式的好处

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

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

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

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

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

 


 

职责链模式结构演示

抽象请求

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

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处理请求2ConcreteHandler1处理请求5ConcreteHandler2处理请求14ConcreteHandler3处理请求22ConcreteHandler2处理请求18ConcreteHandler1处理请求3ConcreteHandler3处理请求27ConcreteHandler3处理请求20

 

转载于:https://www.cnblogs.com/errornull/p/10073458.html

你可能感兴趣的文章
转:JUnit使用指南
查看>>
C++面试题整理(持续更新中)
查看>>
vs2017 git到oschina 方法
查看>>
对Vue为什么不支持IE8的解释之一
查看>>
使用easyUI 为datagrid冻结列
查看>>
开发 web 桌面类程序几个必须关注的细节
查看>>
bzoj 2784: [JLOI2012]时间流逝【树形期望dp】
查看>>
Myeclipse10.7添加本地插件方法
查看>>
Swift - 将字符串拆分成数组(把一个字符串分割成字符串数组)
查看>>
NSRange,判断字符串的各种操作~
查看>>
ElasticSearch客户端注解使用介绍
查看>>
矢量空间存储、栅格空间存储 分布式存储的区别
查看>>
JSON.stringify实战用法
查看>>
#ifndef详解
查看>>
C++11 —— 解包 tuple 参数列表
查看>>
结对编程收获
查看>>
最长回文子串(Manacher)
查看>>
古罗马子串加密
查看>>
TensorBoard:可视化学习
查看>>
图文说明Win10上在VitualBox安装Ubuntu
查看>>