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

职责链设计模式

作者: 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
    

    参考资料

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

    相关文章

      网友评论

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

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