美文网首页
设计模式之责任链模式(ResponsibilityChain)

设计模式之责任链模式(ResponsibilityChain)

作者: 你弄啥来 | 来源:发表于2019-02-16 11:49 被阅读0次

责任链模式:所有的处理者都加入到这个链式,一个处理完之后,转给下一个。

1 抽象出责任接口,具体责任逻辑实现接口。
2 根据处理过程需要,将具体实现组合成链式调用
3 使用者使用链
4 责任链模式的调用过程如下图所示


8572610-8ac5a8de7cd15bcc.png

特点:责任链模式是一种,典型的组合链式调用的方式。遵循一定的顺序来调用,典型:web请求中Filter

代码:
现有一个请求实例Request

package com.chen.strategy.chainproxy;
public class Request {
}

有一个抽象处理责任的接口

package com.chen.strategy.chainproxy;

public interface Repository {
     void doProcess(Request reuqest, ReposibilityChain chain);
}

现有两个责任需要处理Request

package com.chen.strategy.chainproxy;

public class ResponsibilityA implements Repository {

    @Override
    public void doProcess(Request reuqest, ReposibilityChain chain) {
        System.out.println("ResponsibilityA doing SomeThing");
        chain.doProcess(reuqest);
        System.out.println("After ResponsibilityA doing Something");
    }
}


package com.chen.strategy.chainproxy;

public class ResponsibilityB implements Repository {
    @Override
    public void doProcess(Request reuqest, ReposibilityChain chain) {
        System.out.println("ResponsibilityB doing Something");
        chain.doProcess(reuqest);
        System.out.println("After RepositoryA doing Something");
    }
}

通过责任链的方式将两个责任添加到链里,再来实现调用

package com.chen.strategy.chainproxy;

import java.util.ArrayList;
import java.util.List;

/**
 * 责任链模式实现方式
 */
public class ReposibilityChain {

    private List<Repository> repositories;//所有的责任

    private int index = 0;

    public ReposibilityChain() {
        this.repositories = new ArrayList<>();
    }

    public void doProcess(Request reuqest){
        if(this.index<this.repositories.size()){
            this.repositories.get(index++).doProcess(reuqest,this);//在此做到了链式调用,有点像递归。repositories,每次取出来的责任实例是不同的,来完成doProcess方法。
        }
    }

    public static void main(String[] args) {
        ReposibilityChain chain = new ReposibilityChain();
        chain.register(new ResponsibilityB());
        chain.register(new ResponsibilityA());
        chain.doProcess(new Request());
    }


    public void register(Repository repository){
        repositories.add(repository);//将责任注册到该集合中
    }
}

相关文章

网友评论

      本文标题:设计模式之责任链模式(ResponsibilityChain)

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