• c#设计模式-行为型模式 之 责任链模式


    🚀简介

    又名职责链模式,为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对 象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

    👻职责链模式主要包含以下角色 :
    1. 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
    2. 具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
    3. 客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。

    🚀案例

    🐤抽象处理者

    Handler类是所有具体处理者的基类,它定义了一个Handler类型的字段successor,这个字段指向链中的下一个处理者。SetSuccessor方法用于设置这个字段的值。

    当一个请求到来时,如果当前处理者无法处理,它会将请求传递给链中的下一个处理者(即successor)。这就是责任链模式的基本工作原理。

    1. public abstract class Handler
    2. {
    3. protected Handler successor;
    4. public void SetSuccessor(Handler successor)
    5. {
    6. this.successor = successor;
    7. }
    8. public abstract void HandleRequest(int request);
    9. }

    🐤具体处理者

    三个处理者类:ConcreteHandler1,ConcreteHandler2和ConcreteHandler3,它们都继承自抽象处理者类Handler。

    每个具体处理者类都有一个HandleRequest方法,这个方法用于处理请求。如果当前处理者无法处理请求,那么它会将请求传递给下一个处理者。

    例如,ConcreteHandler1只能处理0到10之间的请求,如果请求的值大于10,那么它就会将请求传递给下一个处理者。同样,ConcreteHandler2只能处理10到20之间的请求,如果请求的值大于20,那么它就会将请求传递给下一个处理者。ConcreteHandler3只能处理20到30之间的请求,如果请求的值大于30,那么它就会将请求传递给下一个处理者。

    1. public class ConcreteHandler1 : Handler
    2. {
    3. public override void HandleRequest(int request)
    4. {
    5. if (request >= 0 && request < 10)
    6. {
    7. Console.WriteLine($"{this.GetType().Name} handled request {request}");
    8. }
    9. else if (successor != null)
    10. {
    11. successor.HandleRequest(request);
    12. }
    13. }
    14. }
    15. public class ConcreteHandler2 : Handler
    16. {
    17. public override void HandleRequest(int request)
    18. {
    19. if (request >= 10 && request < 20)
    20. {
    21. Console.WriteLine($"{this.GetType().Name} handled request {request}");
    22. }
    23. else if (successor != null)
    24. {
    25. successor.HandleRequest(request);
    26. }
    27. }
    28. }
    29. public class ConcreteHandler3 : Handler
    30. {
    31. public override void HandleRequest(int request)
    32. {
    33. if (request >= 20 && request < 30)
    34. {
    35. Console.WriteLine($"{this.GetType().Name} handled request {request}");
    36. }
    37. else if (successor != null)
    38. {
    39. successor.HandleRequest(request);
    40. }
    41. }
    42. }

    🐤测试

    1. class MyClass
    2. {
    3. public static void Main(string[] args)
    4. {
    5. Handler h1 = new ConcreteHandler1();
    6. Handler h2 = new ConcreteHandler2();
    7. Handler h3 = new ConcreteHandler3();
    8. h1.SetSuccessor(h2);
    9. h2.SetSuccessor(h3);
    10. int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 };
    11. foreach (int request in requests)
    12. {
    13. h1.HandleRequest(request);
    14. }
    15. }
    16. }

    运行结果

    🚀优缺点

    优点:
    1. 降低了请求发送者和接收者的耦合度。
    2. 可以根据需要增加新的请求处理类,满足开闭原则。
    3. 当工作流程发生变化,可以动态地改变链内的成员或者修改它们的次序,也可动态地新增或者删除责任。
    4. 一个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,这避免了使用众多的 if 或者 if···else 语句。
    5. 每个类只需要处理自己该处理的工作,不能处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则。
    缺点:
    1. 不能保证每个请求一定被处理。由于一个请求没有明确的接收者,所以不能保证它一定会被处理,该请求可能一直传到链的末端都得不到处理。
    2. 对比较长的职责链,请求的处理可能涉及多个处理对象,系统性能将受到一定影响。
    3. 职责链建立的合理性要靠客户端来保证,增加了客户端的复杂性,可能会由于职责链的错误设置而导致系统出错,如可能会造成循环调用。
  • 相关阅读:
    第二章网页前端基础与HTTP协议
    零数科技入选2022“最受投资人欢迎的区块链企业10强”榜单
    【halcon知识】重要的9个元组操作
    KMP算法
    代码随想录二刷day50
    输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数。c++
    【Taro3踩坑日记】不存在全局配置文件:C:\Users\TYW\.taro-global-config\index.json
    css设置锚点与页面顶部保持一定距离
    基于粒子群优化的支持向量机房价预测分析
    当初吃土建起来的“中台”,现在为啥不香了?
  • 原文地址:https://blog.csdn.net/weixin_65243968/article/details/133611392