Java设计模式全集-责任链模式(Chain of Responsibility)

责任链模式(Chain of Responsibility)

即将一组处理器通过串行化的方式组装在一起,共同来处理同一个对象,这个对象具体会在哪一个处理器中进行处理是未知的,可以方便的对不同的需求组织不同的处理器实现高度自由化的定制处理策略

UML

Java设计模式全集-责任链模式(Chain of Responsibility)_第1张图片

  • 从类图上看和策略模式很像,但与策略不同的地方在于,责任链将所有的实现自由的组装到一个链条中,可以是一个遍历的处理器数组,可以是由给每个处理器指定下一个出口,如果自己处理不了就交给下面处理
  • servlet中对Filter的处理,MySql的拦截器,Spring的拦截器 都是这种思路进行链式的处理

小demo

  • 接口定义
/**
 * @author xiaoyingge
 * @description
 * @date 2020/4/24 0:38
 */
public interface Filter {

    void doFilter ();

    void setNext (Filter filter);

}

  • 实现1
/**
 * @author xiaoyingge
 * @description
 * @date 2020/4/24 0:39
 */
public class UserFilter implements Filter {

    private Filter next;

    @Override
    public void doFilter () {
        System.out.println("用户身份认证通过");
        //处理成功,向后传递
        next.doFilter();
    }

    @Override
    public void setNext (Filter filter) {
        this.next = filter;
    }
}

  • 实现2
/**
 * @author xiaoyingge
 * @description
 * @date 2020/4/24 0:39
 */
public class PermissionFilter implements Filter {

    private Filter next;

    @Override
    public void doFilter () {
        System.out.println("当前用户未注册,不允许访问");
        //处理截止,不再调用next.doFilter;
    }

    @Override
    public void setNext (Filter filter) {
        this.next = filter;
    }
}
  • 调用
/**
 * @author xiaoyingge
 * @description
 * @date 2020/4/24 0:45
 */
public class Main {

    public static void main (String[] args) {
        //组装成链,这个过程可以灵活配置
        Filter userFilter = new UserFilter();
        Filter permissionFilter = new PermissionFilter();
        userFilter.setNext(permissionFilter);
        //执行头
        userFilter.doFilter();
    }
}

具体的实现方式有很多,主体思想还是要保证串行化,可打断,对功能可以灵活装卸,同时不对业务代码产生干扰,即把专业的事交给专业的人去做

你可能感兴趣的:(#,设计模式)