美文网首页
职责链设计模式

职责链设计模式

作者: DQ大神奇 | 来源:发表于2019-03-25 17:27 被阅读0次

概述

设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。
使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
设计模式可以分为三大类,分别是创建型、结构型和行为型。

结构型

职责链模式(Chain of Responsibility)

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

结构图

职责链模式结构图

应用场景

可以让多个对象处理同一个请求,实现职责的分离,实现单一职能的原则;可以动态指定一组对象处理请求;可以在不明确指定接收者的情况下,向多个对象中的一个提交一个请求

优点

降低耦合度,请求者和发送者解耦;简化了对象,单一对象只需要负责自己的职责;增强了给对象指派职责的灵活性,可以灵活地对职责链进行增加或者删除。

缺点

不能保证请求一定被接收;系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用;可能不容易观察运行时的特征,有碍于除错。

代码

处理请示的接口

public abstract class Handler {

    protected Handler successor;

    public void setSuccessor(Handler successor){
        this.successor = successor;
    }

    public abstract void HandlerRequest(int request);
}

当请求在0到10处理该请求,否则转到下一个

public class ConcreteHandler1 extends Handler{
    @Override
    public void HandlerRequest(int request) {
        if (request >= 0 && request < 10){ // 0-10处理此请求
            System.out.println("ConcreteHandler1 处理请求" + request);
        }else if (successor != null){
            successor.HandlerRequest(request); // 转移到下一位
        }
    }
}

当请求在10到20处理该请求,否则转到下一个

public class ConcreteHandler2 extends Handler{
    @Override
    public void HandlerRequest(int request) {
        if (request >= 10 && request < 20){ // 10-20处理此请求
            System.out.println("ConcreteHandler2 处理请求" + request);
        }else if (successor != null){
            successor.HandlerRequest(request); // 转移到下一位
        }
    }
}

当请求在20以上处理该请求,否则转到下一个

public class ConcreteHandler3 extends Handler{

    @Override
    public void HandlerRequest(int request) {
        if (request >= 20){ // 20以上处理此请求
            System.out.println("ConcreteHandler3 处理请求" + request);
        }else if (successor != null){
            successor.HandlerRequest(request); // 转移到下一位
        }
    }
}

客户端方法,向链上的具体处理者对象提交请求

public class JavaDemo {
    public static void main(String[] args){
        Handler handler1 = new ConcreteHandler1();
        Handler handler2 = new ConcreteHandler2();
        Handler handler3 = new ConcreteHandler3();
        handler1.setSuccessor(handler2);  // 设置职责链的上下家
        handler2.setSuccessor(handler3);
        List<Integer> list = new ArrayList<>(Arrays.asList(2, 5, 14, 22, 18, 3, 27, 20));
        for (int i : list){
            handler1.HandlerRequest(i);
        }
    }
}

运行结果如下

ConcreteHandler1 处理请求2
ConcreteHandler1 处理请求5
ConcreteHandler2 处理请求14
ConcreteHandler3 处理请求22
ConcreteHandler2 处理请求18
ConcreteHandler1 处理请求3
ConcreteHandler3 处理请求27
ConcreteHandler3 处理请求20

参考资料

本文参考了书籍《大话设计模式》和菜鸟教程设计模式相关部分资料

相关文章

  • 设计模式-工具链模式和迭代器模式

    设计模式-职责链模式和迭代器模式 1.职责链模式 设计动机客户端发出一个请求,职责链上的对象都可以处理这一请求,而...

  • Typescript 职责链模式(Chain of Respon

    标签: 前端 设计模式 职责链模式 typescript Chain of Responsibility 请仔细阅...

  • 设计模式值职责链模式(行为型)

    [TOC] 一、行为型模式 介绍职责链模式之前先介绍一下行为型设计模式,因为按照GoF模式分类,职责链就是一种行为...

  • iOS面试之设计模式模块

    设计模式 设计模式内容如下: 责任链模式 桥接模式 命令模式 适配器模式 单例模式 等等 设计原则 单一职责原则 ...

  • Java设计模式系列-责任链模式

    原创文章,转载请标注出处:《Java设计模式系列-责任链模式》 一、概述 职责链模式(称责任链模式)将请求的处理对...

  • 职责链设计模式

    概述 设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。使用...

  • 设计模式 || 职责链

    “我要涨工资!!” “好,那你打份申请表吧:涨50让你主管签个字,涨500让你主管和部门经理签字,涨5000让你主...

  • 设计模式-职责链

    说起职责链模式,其实非常像AOP[https://baike.baidu.com/item/AOP/1332219...

  • 设计模式——职责链模式

    一. 概述 一. 概述 职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,...

  • 设计模式——职责链模式

    前言 设计模式是指导一个程序猿以更好的姿态处理一些问题,而不再像刚学编程的我们,只会使用if-else分支语句,或...

网友评论

      本文标题:职责链设计模式

      本文链接:https://www.haomeiwen.com/subject/ifdbvqtx.html